CREATE EXTERNAL TABLE - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

CREATE EXTERNAL TABLE

在指定的結構描述中建立新的外部資料表。所有外部資料表都必須經由外部結構描述建立。外部結構描述和外部資料表不支援搜尋路徑。如需詳細資訊,請參閱CREATE EXTERNAL SCHEMA

除了使用CREATEEXTERNALTABLE命令建立的外部資料表之外,Amazon Redshift 還可以參考 AWS Lake Formation 目錄 AWS Glue 或 Apache Hive 中繼存放區中定義的外部資料表。使用 CREATE EXTERNAL SCHEMA 命令註冊外部目錄中定義的外部資料庫,並且在 Amazon Redshift 中將外部資料表提供使用。如果外部表存在於 AWS Glue 或 AWS Lake Formation 目錄或 Hive 中繼存儲中,則不需要使用CREATEEXTERNALTABLE創建表。若要檢視外部資料表,請查詢 SVV_EXTERNAL_TABLES 系統畫面。

透過執行 CREATE EXTERNAL TABLE AS 命令,您可以根據查詢中的資料行定義建立外部資料表,並將該查詢的結果寫入 Amazon S3。結果為 Apache Parquet 或分隔文字格式。如果外部資料表有一個或多個分割區索引鍵,Amazon Redshift 會根據這些分割區索引鍵來分割新檔案,並自動將新的分割區註冊到外部類別目錄中。若要取得有關 CREATE EXTERNAL TABLE AS 的更多資訊,請參閱使用須知

您可以使用與其他 Amazon Redshift 表格搭配使用的相同SELECT語法來查詢外部資料表。您也可以使用INSERT語法將新檔案寫入 Amazon S3 上外部資料表的位置。如需詳細資訊,請參閱INSERT(外部表格)

若要使用外部資料表建立檢視,請在陳述式中包含 WITH NO SCHEMA BINDING 子CREATE VIEW句。

您不能在事務CREATEEXTERNALTABLE中運行(BEGIN...END)。如需交易的相關資訊,請參閱 可序列化隔離

所需權限

您必須為外部結構描述的擁有者或超級使用者,始可建立外部資料表。若要轉移外部結構描述的所有權,請ALTERSCHEMA使用變更擁有者。外部資料表的存取權是由外部結構描述的存取權所控制。您無法對外部資料表上的許可執行 GRANTREVOKE。請改為授與或撤銷USAGE外部結構描述。

使用須知 具有有關外部資料表特定權限的其他資訊。

語法

CREATE EXTERNAL TABLE
external_schema.table_name
(column_name data_type [, …] )
[ PARTITIONED BY (col_name data_type [, … ] )]
[ { ROW FORMAT DELIMITED row_format |
  ROW FORMAT SERDE 'serde_name'
  [ WITH SERDEPROPERTIES ( 'property_name' = 'property_value' [, ...] ) ] } ]
STORED AS file_format
LOCATION { 's3://bucket/folder/' | 's3://bucket/manifest_file' }
[ TABLE PROPERTIES ( 'property_name'='property_value' [, ...] ) ]

以下是 CREATE EXTERNAL TABLE AS 的語法。

CREATE EXTERNAL TABLE
external_schema.table_name
[ PARTITIONED BY (col_name [, … ] ) ]
[ ROW FORMAT DELIMITED row_format ]
STORED AS file_format
LOCATION { 's3://bucket/folder/' }
[ TABLE PROPERTIES ( 'property_name'='property_value' [, ...] ) ]
 AS
 { select_statement }
         

參數

external_schema.table_name

要建立的資料表名稱,以外部結構描述名稱限定。外部資料表必須建立在外部結構描述中。如需詳細資訊,請參閱CREATE EXTERNAL SCHEMA

資料表名稱的長度上限為 127 個位元組;超過此長度的名稱會截斷至 127 個位元組。您最多可以使用 UTF -8 個多位元組字元,最多四個位元組。Amazon Redshift 會強制執行每個叢集 9,900 個資料表的限制,包括使用者定義的臨時資料表,以及 Amazon Redshift 在查詢處理或系統維護期間建立的臨時資料表。您也可以選擇使用資料庫名稱來限定資料表名稱。在以下範例中,資料庫名稱為 spectrum_db,外部結構描述名稱為 spectrum_schema,而資料表名稱為 test

create external table spectrum_db.spectrum_schema.test (c1 int) stored as parquet location 's3://amzn-s3-demo-bucket/myfolder/';

如果指定的資料庫或結構描述不存在,則不會建立資料表,而且陳述式會傳回錯誤。您無法在系統資料庫 template0template1padb_harvestsys:internal 中建立資料表或檢視。

資料表名稱對於指定的結構描述來說必須是唯一的。

如需有效名稱的相關資訊,請參閱 名稱與識別碼

( column_name data_type )

要建立的每個資料欄的名稱和資料類型。

資料欄名稱的長度上限為 127 個位元組;超過此長度的名稱會截斷至 127 個位元組。您最多可以使用 UTF -8 個多位元組字元,最多四個位元組。您無法指定資料欄名稱 "$path""$size"。如需有效名稱的相關資訊,請參閱 名稱與識別碼

Amazon Redshift 預設會以虛擬資料欄 $path$size 建立外部資料表。您可以藉由將 spectrum_enable_pseudo_columns 組態參數設定為 false,以停用工作階段的虛擬資料欄建立。如需詳細資訊,請參閱虛擬資料欄

若已啟用虛擬資料欄,則單一資料表中可定義的資料欄數目上限為 1,598 個。若未啟用虛擬資料欄,則單一資料表中可定義的資料欄數目上限為 1,600 個。

若您要建立「寬資料表」,則務必確定在載入和查詢處理期間,您的資料欄清單未超過中繼結果的資料列寬度界限。如需詳細資訊,請參閱使用須知

對於 CREATE EXTERNAL TABLE AS 命令,不需要列列列表,因為列是從查詢派生的。

data_type

支援以下 資料類型

  • SMALLINT (INT2)

  • INTEGER (INT, INT4)

  • BIGINT (INT8)

  • DECIMAL (NUMERIC)

  • REAL (FLOAT4)

  • DOUBLE PRECISION (FLOAT8)

  • BOOLEAN (BOOL)

  • CHAR (CHARACTER)

  • VARCHAR (CHARACTER VARYING)

  • VARBYTE(CHARACTERVARYING) — 可與 Parquet 和ORC資料檔案搭配使用,而且只能與非分區資料表搭配使用。

  • DATE— 只能與文字、實木地板或ORC資料檔案搭配使用,或作為分割欄使用。

  • TIMESTAMP

對於DATE,您可以使用如下所述的格式。使用數字表示的月份值支援下列格式:

  • mm-dd-yyyy 例如:05-01-2017。此為預設值。

  • yyyy-mm-dd,其中年份由 2 個以上的數字表示。例如:2017-05-01

使用三個字母縮寫表示的月份值支援下列格式:

  • mmm-dd-yyyy 例如:may-01-2017。此為預設值。

  • dd-mmm-yyyy,其中年份由 2 個以上的數字表示。例如:01-may-2017

  • yyyy-mmm-dd,其中年份由 2 個以上的數字表示。例如:2017-may-01

對於始終小於 100 的年份值,年份的計算方式如下:

  • 如果年份小於 70,則該年份的計算方式為年份加上 2000。例如,使用 mm-dd-yyyy 格式的日期 05-01-17 會轉換成 05-01-2017

  • 如果年份小於 100 且大於 69,則該年份的計算方式為年份加上 1900。例如,使用 mm-dd-yyyy 格式的日期 05-01-89 會轉換成 05-01-1989

  • 對於以兩個數字表示的年份值,請在前面加上零以使用 4 個數字表示年份。

文字檔案中的時間戳記值格式必須為 yyyy-mm-dd HH:mm:ss.SSSSSS,如以下的時間戳記值所示:2017-05-01 11:30:59.000000

VARCHAR列的長度是以字節定義的,而不是字符。例如,一個 VARCHAR (12) 資料行可以包含 12 個單一位元組字元或 6 個雙位元組字元。查詢外部資料表時,結果會截斷以配合定義的資料欄大小,而不會傳回錯誤。如需詳細資訊,請參閱儲存與範圍

為獲得最佳效能,建議您指定可配合您的資料的最小資料欄大小。若要尋找資料行中值的最大大小 (以位元組為單位),請使用 OCTET_ LENGTH 函數。下列範例會傳回電子郵件資料欄中值的大小上限。

select max(octet_length(email)) from users; max --- 62
PARTITIONED通過(合併名稱數據類型 [,...])

此子句會定義包含一個或多個分割區資料欄的分割資料表。每種指定的組合都會另外使用一個資料目錄,這樣可在某些情況下改善查詢效能。資料表資料內並未包含分割資料欄。如果您對 col_name 使用的值與資料表資料欄相同,則會發生錯誤。

建立分區資料表之後,請使用ALTER TABLE... ADD PARTITION 陳述式來變更資料表,將新的分割區註冊至外部目錄。當您新增分割區時,會定義 Amazon S3 上包含分割區資料的子資料夾位置。

例如,如果資料表spectrum.lineitem_part是使用定義的PARTITIONED BY (l_shipdate date),請執行下列ALTERTABLE命令來新增分割區。

ALTER TABLE spectrum.lineitem_part ADD PARTITION (l_shipdate='1992-01-29') LOCATION 's3://spectrum-public/lineitem_partition/l_shipdate=1992-01-29';

如果您使用的是 CREATE EXTERNAL TABLE AS,則不需要運行 ALTERTABLE... ADDPARTITION。Amazon Redshift 會自動在外部目錄中註冊新的分割區。Amazon Redshift 也會根據資料表中定義的一個或多個分割區索引鍵,自動將對應的資料寫入 Amazon S3 中的分割區。

若要檢視分割區,請查詢 SVV_EXTERNAL_PARTITIONS 系統畫面。

注意

對於 CREATE EXTERNAL TABLE AS 命令,您不需要指定分區資料行的資料類型,因為這個資料行是衍生自查詢。

ROWFORMATDELIMITED列格式

此子句會指定基礎資料的格式。rowformat 可能的值如下:

  • LINESTERMINATED通過 '分隔符'

  • FIELDSTERMINATED通過 '分隔符'

指定「分隔符號」的單一ASCII字元。您可以使用八進制指定非打印ASCII字符,格式'\ddd'd為八進制數字(0—7),最多為 '\ 177'。下面的例子指定使用八進制BEL(bell)字符。

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\007'

如果省ROWFORMAT略,則默認格式為 DELIMITED FIELDS TERMINATED BY '\ A'(標題的開始)和 LINES TERMINATED BY'\ n '(換行符)。

ROWFORMATSERDE'服務器名稱'
[WITHSERDEPROPERTIES('屬性名稱' = '屬性值' [,...])]

指定基礎資料SERDE格式的子句。

'serde_name'

的名稱 SerDe。您可以指定下列格式:

  • 或者. 阿帕奇. 哈多普. RegexSerDe

  • com. 亞馬遜. 葡萄糖. GrokSerDe

  • 或者阿帕奇 .Hadoop.hive.serde2.o penCSVSerde

    此參數支援 O 的下列 SerDe 屬性penCSVSerde:

    'wholeFile' = 'true'

    wholeFile屬性設置為true以正確解析打開CSV請求的帶引號字符串中的新行字符(\ n)。

  • 組織. 開發. 數據. JsonSerDe

    • 該JSONSERDE還支持離子文件。

    • 必JSON須格式良好。

    • 時間戳記 (Ion),且JSON必須使用 ISO86 01 格式。

    • 此參數支援下列 SerDe 屬性 JsonSerDe:

      'strip.outer.array'='true'

      處理包含括在外括號([...])一個非常大的數組離子/JSON文件,就好像它包含數組中的多個JSON記錄一樣。

  • am. 亞馬遜. 離子組織. IonHiveSerDe

    除了資料類型外,Amazon ION 格式還提供文字和二進位格式。對於參考格式資料的外部表ION格,您可以將外部表格中的每一欄對映至ION格式資料中的對應元素。如需詳細資訊,請參閱 Amazon Ion。您還需要指定輸入和輸出格式。

WITHSERDEPROPERTIES('屬性名稱' = '屬性值' [,...])]

選擇性地指定屬性名稱和值,並以逗號分隔。

如果省ROWFORMAT略,則默認格式為 DELIMITED FIELDS TERMINATED BY '\ A'(標題的開始)和 LINES TERMINATED BY'\ n '(換行符)。

STOREDAS 檔案格式

資料檔案的檔案格式。

有效格式如下:

  • PARQUET

  • RCFILE( ColumnarSerDe 僅供資料使用,不適用 LazyBinaryColumnarSerDe)

  • SEQUENCEFILE

  • TEXTFILE(適用於文字檔案,包括JSON檔案)。

  • ORC

  • AVRO

  • INPUTFORMAT'輸入格式類名' '輸出格式類名' OUTPUTFORMAT

CREATEEXTERNALTABLEAS 指令僅支援兩種檔案格式TEXTFILE和PARQUET。

對於INPUTFORMAT和OUTPUTFORMAT,指定類別名稱,如下列範例所示。

'org.apache.hadoop.mapred.TextInputFormat'
LOCATION{'s3://桶/文件夾 /' | 'S3://桶/清單文件 '}

包含資料檔案的 Amazon S3 儲存貯體或資料夾路徑,或包含 Amazon S3 物件路徑清單的資訊清單檔案。儲存貯體必須與 Amazon 紅移叢集位於相同的 AWS 區域。如需支援的 AWS 區域清單,請參閱Amazon Redshift Spectrum 考量事項

如果路徑指定的是儲存貯體或資料夾,例如 's3://amzn-s3-demo-bucket/custdata/',則 Redshift Spectrum 會掃描指定儲存貯體或資料夾以及任何子資料夾裡的檔案。Redshift Spectrum 會忽略隱藏檔案以及開頭為句號或底線的檔案。

如果路徑指定的是資訊清單檔案,則 's3://bucket/manifest_file' 引數必須明確參考單一檔案,例如 's3://amzn-s3-demo-bucket/manifest.txt'。無法參考金鑰前綴。

資訊清單是JSON格式的文字檔,列出URL要從 Amazon S3 載入的每個檔案,以及檔案大小 (以位元組為單位)。包URL括檔案的值區名稱和完整物件路徑。資訊清單中指定的檔案可以位於不同的值區中,但所有值區都必須與 Amazon Redshift 叢集位於相同的 AWS 區域中。如果某個檔案列出兩次,則該檔案會載入兩次。下列範例顯示JSON載入三個檔案的資訊清單。

{ "entries": [ {"url":"s3://amzn-s3-demo-bucket1/custdata.1", "meta": { "content_length": 5956875 } }, {"url":"s3://amzn-s3-demo-bucket1/custdata.2", "meta": { "content_length": 5997091 } }, {"url":"s3://amzn-s3-demo-bucket2/custdata.1", "meta": { "content_length": 5978675 } } ] }

您可以讓包含特定檔案變為強制性。若要這麼做,請在資訊清單中的檔案層級包含 mandatory 選項。當您查詢具有遺失必要檔案的外部資料表時,SELECT陳述式會失敗。確定外部資料表定義中包含的所有檔案均存在。如果並非全部存在,則會出現錯誤,顯示找不到第一個強制性檔案。下列範例顯示mandatory選項設定JSON為的資訊清單true

{ "entries": [ {"url":"s3://amzn-s3-demo-bucket1/custdata.1", "mandatory":true, "meta": { "content_length": 5956875 } }, {"url":"s3://amzn-s3-demo-bucket1/custdata.2", "mandatory":false, "meta": { "content_length": 5997091 } }, {"url":"s3://amzn-s3-demo-bucket2/custdata.1", "meta": { "content_length": 5978675 } } ] }

若要參考使用建立的檔案UNLOAD,您可以使用使用MANIFEST參數建立UNLOAD的資訊清單。資訊清單檔案與 COPY從 Amazon S3 的資訊清單檔案相容,但使用不同的索引鍵。未使用的索引鍵會加以忽略。

TABLEPROPERTIES('屬性名稱' = '屬性值' [,...])

此子句會設定資料表屬性的資料表定義。

注意

資料表屬性區分大小寫。

'compression_type'='value'

如果檔案名稱未包含副檔名,此屬性會設定要使用的壓縮類型。如果您設定此屬性,但是有副檔名,則會忽略副檔名並使用屬性所設定的值。壓縮類型的有效值如下所示:

  • bzip2

  • gzip

  • snappy

'data_cleansing_enabled'='true / false’

此屬性會設定資料表的資料處理是否開啟。當 'data_cleansing_enabled' 設定為 true 時,資料表的資料處理為開啟狀態。當 'data_cleansing_enabled' 設定為 false 時,資料表的資料處理為關閉狀態。以下是此屬性所控制的資料表層級資料處理屬性清單:

  • column_count_mismatch_handling

  • invalid_char_handling

  • numeric_overflow_handling

  • replacement_char

  • surplus_char_handling

如需範例,請參閱 資料處理範例

'invalid_char_handling'='value'

指定當查詢結果包含無效的 UTF -8 個字元值時要執行的動作。您可以指定下列動作:

DISABLED

不執行無效的字元處理。

FAIL

取消傳回包含無效 UTF -8 值之資料的查詢。

SET_ 到 _ NULL

將無效的 UTF -8 值取代為空值。

DROP_ROW

將資料列中的每個值取代為 null。

REPLACE

以您使用 replacement_char 指定的取代字元取代無效字元。

'replacement_char'='character

指定當您將 invalid_char_handling 設定為 REPLACE 時要使用的取代字元。

'numeric_overflow_handling'='value’

指定當ORC資料包含大於資料行定義 (例如 int16) 的整數 (例如 int64) 時要執行的動作。BIGINT SMALLINT您可以指定下列動作:

DISABLED

無效字元處理已關閉。

FAIL

當資料包含無效字元時,取消查詢。

SET_ 到 _ NULL

將無效字符設定為 null。

DROP_ROW

將資料列中的每個值設定為 null。

'surplus_bytes_handling'='value'

指定如何處理載入超過針對包含資料之資料行所定義之資料類型長度的VARBYTE資料。根據預設,Redshift Spectrum 會針對超出欄寬度的資料,將值設定為 null。

您可以指定當查詢傳回超過資料類型長度的資料時,執行下列動作:

SET_ 到 _ NULL

以 null 取代超過欄寬的資料。

DISABLED

不執行多餘位元組處理。

FAIL

取消傳回資料超出欄寬的查詢。

DROP_ROW

捨棄包含超出欄寬之資料的所有資料列。

TRUNCATE

如果字元超過為欄定義的字元數目上限,則移除字元。

'surplus_char_handling'='value'

指定如何處理載入超過針對包含VARCHAR、CHAR或字串資料之資料行所定義之資料類型長度的資料。根據預設,Redshift Spectrum 會針對超出欄寬度的資料,將值設定為 null。

您可以指定當查詢傳回超過欄寬的資料時,執行下列動作:

SET_ 到 _ NULL

以 null 取代超過欄寬的資料。

DISABLED

不執行多餘字元處理。

FAIL

取消傳回資料超出欄寬的查詢。

DROP_ROW

將資料列中的每個值取代為 null。

TRUNCATE

如果字元超過為欄定義的字元數目上限,則移除字元。

'column_count_mismatch_handling'='value’

識別檔案包含的資料列值是否少於或多於外部資料表定義中指定的欄數。此屬性僅適用於未壓縮的文字檔案格式。您可以指定下列動作:

DISABLED

欄計數不相符處理已關閉。

FAIL

如果偵測到資料欄計數不相符,則查詢失敗。

SET_ 到 _ NULL

使用填充缺少的值,NULL並忽略每行中的其他值。

DROP_ROW

從掃描中捨棄包含欄計數不相符錯誤的所有資料列。

'numRows' = '行計數'

設定資料表定義 numRows 值的屬性。若要明確更新外部資料表的統計資料,請設定numRows屬性以指出資料表的大小。Amazon Redshift 不會分析外部資料表來產生查詢最佳化工具用來產生查詢計劃的資料表統計資料。如果資料表統計資訊沒有為外部資料表進行設定,則 Amazon Redshift 會以「外部資料表較大而本機資料表較小」的假設來產生查詢執行計畫。

'skip.header.line.count'='line_count'

此屬性會設定每個來源檔案開頭要略過的資料列數。

'serialization.null.format'=' '

此屬性會指定,欄位中提供的文字有完全相符項目時,Spectrum 應傳回 NULL 值。

'orc.schema.resolution'='mapping_type'

為使用ORC資料格式的表格設定欄對映類型的性質。將針對其他所有日期格式忽略此屬性。

資料欄映射類型的有效值如下所示:

  • name

  • position

如果忽略 orc.schema.resolution 屬性,則預設會依名稱映射資料欄。如果 orc.schema.resolution 設為 'name''position' 以外的任何值,則會依位置映射資料欄。如需資料欄映射的相關資訊,請參閱 將外部表格欄對映至ORC欄

注意

該COPY命令僅按位置映射到ORC數據文件。orc.schema.解析表格屬性對命令行為沒有影響。COPY

'write.parallel'='on/off’

設定 CREATE EXTERNAL TABLE AS 是否應 parallel 寫入資料的屬性。根據預設,CREATEEXTERNALTABLEAS 會根據叢集中的磁碟片段數目,parallel 寫入資料到多個檔案。預設選項為開啟。當「寫入 .並行」設定為關閉時,CREATEEXTERNALTABLEAS 會以序列方式將一或多個資料檔案寫入 Amazon S3。此 table 屬性也適用於任何後續INSERT陳述式放入同一個外部資料表中。

‘write.maxfilesize.mb’=‘size’

設定由 AS 寫入 Amazon S3 之每個檔案的大小上限 (以 MB CREATE EXTERNAL TABLE 為單位) 的屬性。大小必須是介於 5 到 6200 之間的有效整數。預設的檔案大小上限為 6,200 MB。此 table 屬性也適用於任何後續INSERT陳述式放入同一個外部資料表中。

‘write.kms.key.id’=‘value

您可以指定 AWS Key Management Service 金鑰來為 Amazon S3 物件啟用伺服器端加密 (SSE),其中為下列其中一項:

  • auto使用存放在 Amazon S3 儲存貯體中的預設 AWS KMS 金鑰。

  • 您指定用來加密資料的 kms-key

select_statement

透過定義任何查詢,將一或多個列插入外部資料表的陳述式。查詢產生的所有列都會根據表格定義,以文字或 Parquet 格式寫入到 Amazon S3。

您可在 範例 取得範例集合。