Description
This statement is used to create an external table in a database.
An external table is a key feature in a database management system. Generally, a table in a database stores data in the storage space of the database, while an external table stores data in an external storage service.
When you create an external table, you must specify the file path and file format of the data. After that, you can use the external table to read data from the external storage service. An external table is read-only. You can use it in a query statement, but you cannot perform DML operations on it. You cannot define constraints or create indexes on an external table.
Syntax
CREATE EXTERNAL TABLE <table_name>
( [ <column_name> <column_type> [AS <expr>] ]
[ , <column_name> <column_type> [AS <expr>] ]
[ , ... ] )
LOCATION = '<string>'
FORMAT = (
TYPE = 'CSV'
LINE_DELIMITER = '<string>' | <expr>
FIELD_DELIMITER = '<string>' | <expr>
ESCAPE = '<character>' | <expr>
FIELD_OPTIONALLY_ENCLOSED_BY = '<character>' | <expr>
ENCODING = 'charset'
NULL_IF = ('<string>' | <expr>, '<string>' | <expr> ...)
SKIP_HEADER = <int>
SKIP_BLANK_LINES = { TRUE | FALSE }
TRIM_SPACE = { TRUE | FALSE }
EMPTY_FIELD_AS_NULL = { TRUE | FALSE }
)
[ PATTERN = '<regex_pattern>' ]
Parameter description
| Parameter | Description |
|---|---|
| table_name | The name of the external table to be created. |
| column_name | The name of a column in the external table. By default, the data columns in the file are automatically mapped to the definition columns of the external table in order. |
| column_type | The type of a column in the external table. You cannot define constraints such as DEFAULT, NOT NULL, UNIQUE, CHECK, PRIMARY KEY, or FOREIGN KEY for an external table column. |
| AS |
Manually specifies column mappings. When the order of columns in a file is inconsistent with the definition order of columns in the external table, you can specify the correspondence between a column in the external table and the Nth column in the file by using the pseudo-column metadata$filecol{N}. For example, c2 INT AS (metadata$filecol4) indicates that the c2 column in the external table corresponds to the fourth column in the file. Note that if you specify manual column mappings, automatic mappings will become invalid, and mappings must be defined manually for all columns. |
| LOCATION | The path where the external table files are stored. Generally, the data files of an external table are stored in a separate directory, which can contain subdirectories. When you create an external table, the system automatically collects all files in the specified directory.
NoticeWhen you use an object storage path, separate the parameters in the object storage path with |
| FORMAT | The format of external files.
|
| PATTERN | A regular expression pattern used to filter files in the LOCATION directory. For each file in the LOCATION directory, if the file path matches the pattern, the external table accesses the file. Otherwise, the external table skips the file. If this parameter is not specified, the external table, by default, accesses all files in the LOCATION directory. The external table stores the list of files that match the PATTERN in the system table of the database. When the external table scans files, it accesses external files based on this list. |
Usage
- If an external file is deleted, files in the file list of the external table will no longer exist. In this case, the external table will ignore the non-existent file.
- If an external file is modified, the external table can access the latest data of the external file. If the modification of the external file is concurrent with the query of the external table, the result may not meet the expectations. Therefore, you are advised to avoid modifying the external file while querying the external table.
- If a new file is added to the external directory, the external table will not access the new file. If you want to add the new file to the file list of the external table, you need to update the file list of the external table.
Examples
Prepare data. First, set the path of
secure_file_privto/home/admin/. Place the CSV file namedextdata.csv, which contains the data to be imported as the external table, in the/home/admin/testdirectory on the local OBServer node that is connected.Here is an example of setting the global secure path.
obclient> SET GLOBAL secure_file_priv = "" Query OK, 0 rows affected obclinet> \q ByeNote
Since
secure_file_privis aGLOBALvariable, you need to execute\qto make the setting take effect.The CSV file contains the following data:
1,'Dave','Smith','dsmith@outlook.com','friend',32 2,'Xena','Johnson','xjonson@outlook.com','contact',45 3,'Fred','Jackon','fjackson@outlook.com','co-worker',19 4,'Alma','Tyler','atyler@outlook.com','friend',53Log in to the database as a user in the tenant and create an external table named
contacts.obclient> CREATE EXTERNAL TABLE contacts ( id INT, firstname VARCHAR(100), lastname VARCHAR(100), email VARCHAR(255), category CHAR(30), age NUMBER ) LOCATION = '/home/admin/test' FORMAT = ( TYPE = 'CSV' FIELD_DELIMITER = ',' FIELD_OPTIONALLY_ENCLOSED_BY ='\'' ) PATTERN = 'extdata.csv';Query data in the
contactsexternal table.obclient> SELECT * FROM contacts; +----+-----------+----------+----------------------+-----------+------+ | id | firstname | lastname | email | category | age | +----+-----------+----------+----------------------+-----------+------+ | 1 | Dave | Smith | dsmith@outlook.com | friend | 32 | | 2 | Xena | Johnson | xjonson@outlook.com | contact | 45 | | 3 | Fred | Jackon | fjackson@outlook.com | co-worker | 19 | | 4 | Alma | Tyler | atyler@outlook.com | friend | 53 | +----+-----------+----------+----------------------+-----------+------+ 4 rows in set