如果您需要將OSS中的數據導入至云原生數據倉庫 AnalyticDB MySQL 版,可以參考本文檔,通過外表導入方式將OSS中Parquet、CSV和ORC格式的數據文件導入至數倉版。
前提條件
AnalyticDB for MySQL集群的產品系列為數倉版。
說明數倉版彈性模式集群需要在集群信息頁面的網絡信息區域,打開啟用ENI網絡的開關。
AnalyticDB for MySQL集群與OSS存儲空間位于同一地域。具體操作,請參見開通OSS服務。
示例數據說明
本示例將oss_import_test_data.csv
文件上傳至OSS中的testBucketname/adb/
目錄,數據行分隔符為換行符,列分隔符為半角分號(;)。oss_import_test_data.csv
文件示例數據如下所示:
uid;other
12;hello_world_1
27;hello_world_2
28;hello_world_3
33;hello_world_4
37;hello_world_5
40;hello_world_6
操作步驟
在AnalyticDB for MySQL中創建數據庫。
CREATE DATABASE adb_demo;
創建外表。使用CREATE TABLE語法創建CSV、Parquet或ORC格式的OSS外表。具體語法,請參見OSS外表語法。
本文示例以CSV格式非分區外表為例。
CREATE TABLE IF NOT EXISTS oss_import_test_external_table ( uid string, other string ) ENGINE='OSS' TABLE_PROPERTIES='{ "endpoint":"oss-cn-hangzhou-internal.aliyuncs.com", "url":"oss://testBucketname/adb/oss_import_test_data.csv", "accessid":"LTAIF****5FsE", "accesskey":"Ccw****iWjv", "delimiter":";", "skip_header_line_count":1, "charset":"utf-8" }';
查詢
oss_import_test_external_table
外表數據。說明對于CSV格式、Parquet和ORC格式數據文件,數據量越大,通過外表查詢的性能損耗越大。如果您需要進一步提升查詢效率,建議您按照后續步驟(4~5)將OSS外表數據導入AnalyticDB for MySQL后再做查詢。
SELECT uid, other FROM oss_import_test_external_table WHERE uid < 100 LIMIT 10;
在AnalyticDB for MySQL中創建表,用于存儲從OSS外表導入的數據。
CREATE TABLE IF NOT EXISTS adb_oss_import_test ( uid string, other string ) DISTRIBUTED BY HASH(uid);
執行INSERT語句將OSS外表數據導入AnalyticDB for MySQL。
重要使用
INSERT INTO
或INSERT OVERWRITE SELECT
導入數據時,默認是同步執行流程。如果數據量較大,達到幾百GB,客戶端到AnalyticDB for MySQL服務端的連接需要保持較長時間。在此期間,可能會因為網絡因素導致連接中斷,進而導致數據導入失敗。因此,如果您的數據量較大時,推薦使用SUBMIT JOB INSERT OVERWRITE SELECT
異步執行導入。方式一:執行
INSERT INTO
導入數據,當主鍵重復時會自動忽略當前寫入數據,不進行更新覆蓋,作用等同于INSERT IGNORE INTO
,詳情請參見INSERT INTO。示例如下:INSERT INTO adb_oss_import_test SELECT * FROM oss_import_test_external_table;
方式二:執行INSERT OVERWRITE導入數據,會覆蓋表中原有的數據。示例如下:
INSERT OVERWRITE adb_oss_import_test SELECT * FROM oss_import_test_external_table;
方式三:異步執行
INSERT OVERWRITE
導入數據。 通常使用SUBMIT JOB
提交異步任務,由后臺調度,可以在寫入任務前增加Hint(/*+ direct_batch_load=true*/
)加速寫入任務。詳情請參見異步寫入。示例如下:SUBMIT JOB INSERT OVERWRITE adb_oss_import_test SELECT * FROM oss_import_test_external_table;
返回結果如下:
+---------------------------------------+ | job_id | +---------------------------------------+ | 2020112122202917203100908203303****** |
關于異步提交任務詳情,請參見異步提交導入任務。
OSS外表語法
OSS非分區外表
CREATE TABLE [IF NOT EXISTS] table_name
(column_name column_type[, …])
ENGINE='OSS'
TABLE_PROPERTIES='{
"endpoint":"endpoint",
"url":"OSS_LOCATION",
"accessid":"accesskey_id",
"accesskey":"accesskey_secret",
"format":"txt|orc|parquet",
"delimiter":";",
"skip_header_line_count":1,
"charset":"utf-8"
}';
外表類型 | 參數 | 是否必填 | 說明 |
CSV格式、Parquet格式或OSS ORC格式外表 | ENGINE='OSS' | 是 | 表引擎,固定填寫為OSS。 |
endpoint | OSS的EndPoint(地域節點)。 目前僅支持AnalyticDB for MySQL通過VPC網絡訪問OSS。 說明 您可登錄OSS控制臺,單擊目標Bucket,在Bucket概覽頁面查看EndPoint(地域節點)。 | ||
url | 指定OSS文件或目錄所在的路徑。
| ||
accessid | 阿里云賬號或者具備OSS管理權限的RAM用戶的AccessKey ID。 如何獲取AccessKey ID,請參見賬號與權限。 | ||
accesskey | 阿里云賬號或者具備OSS管理權限的RAM用戶的AccessKey Secret。 如何獲取AccessKey Secret,請參見賬號與權限。 | ||
CSV格式外表 | delimiter | 定義CSV數據文件的列分隔符。 | |
Parquet格式、OSS ORC格式外表 | format | 數據文件的格式。
說明
| |
CSV格式外表 | null_value | 否 | 定義CSV數據文件的 重要 僅內核版本為3.1.4.2及以上的集群支持配置該參數。 |
ossnull | 選擇CSV數據文件中
說明 上述各示例的前提為 | ||
skip_header_line_count | 定義導入數據時需要在開頭跳過的行數。CSV文件第一行為表頭,若設置該參數為1,導入數據時可自動跳過第一行的表頭。 默認取值為0,即不跳過。 | ||
oss_ignore_quote_and_escape | 是否忽略字段值中的引號和轉義。默認取值為false,即不忽略字段值中的引號和轉義。 重要 僅內核版本為3.1.4.2及以上的集群支持配置該參數。 | ||
charset | OSS外表字符集,取值說明:
重要 僅內核版本為3.1.10.4及以上的集群支持配置該參數。 |
外表創建語句中的列名需與Parquet或ORC文件中該列的名稱完全相同(可忽略大小寫),且列的順序需要一致。
創建外表時,可以僅選擇Parquet或ORC文件中的部分列作為外表中的列,未被選擇的列不會被導入。
如果創建外表創建語句中出現了Parquet或ORC文件中不存在的列,針對該列的查詢結果均會返回NULL。
Parquet文件、ORC文件與AnalyticDB for MySQL的數據類型映射關系
Parquet文件與AnalyticDB for MySQL的數據類型映射關系
Parquet基本類型 | Parquet的logicalType類型 | AnalyticDB for MySQL的數據類型 |
BOOLEAN | 無 | BOOLEAN |
INT32 | INT_8 | TINYINT |
INT32 | INT_16 | SMALLINT |
INT32 | 無 | INT或INTEGER |
INT64 | 無 | BIGINT |
FLOAT | 無 | FLOAT |
DOUBLE | 無 | DOUBLE |
| DECIMAL | DECIMAL |
BINARY | UTF-8 |
|
INT32 | DATE | DATE |
INT64 | TIMESTAMP_MILLIS | TIMESTAMP或DATETIME |
INT96 | 無 | TIMESTAMP或DATETIME |
Parquet格式外表暫不支持STRUCT
類型,會導致建表失敗。
ORC文件與AnalyticDB for MySQL的數據類型映射關系
ORC文件中的數據類型 | AnalyticDB for MySQL中的數據類型 |
BOOLEAN | BOOLEAN |
BYTE | TINYINT |
SHORT | SMALLINT |
INT | INT或INTEGER |
LONG | BIGINT |
DECIMAL | DECIMAL |
FLOAT | FLOAT |
DOUBLE | DOUBLE |
|
|
TIMESTAMP | TIMESTAMP或DATETIME |
DATE | DATE |
ORC格式外表暫不支持LIST
、STRUCT
和UNION
等復合類型,會導致建表失敗。ORC格式外表的列使用MAP
類型可以建表,但ORC的查詢會失敗。
AnalyticDB for MySQL支持通過OSS的CSV格式的外表讀寫Hive TEXT文件。建表語句如下:
CREATE TABLE adb_csv_hive_format_oss (
a tinyint,
b smallint,
c int,
d bigint,
e boolean,
f float,
g double,
h varchar,
i varchar, -- binary
j timestamp,
k DECIMAL(10, 4),
l varchar, -- char(10)
m varchar, -- varchar(100)
n date
) ENGINE = 'OSS' TABLE_PROPERTIES='{
"format": "csv",
"endpoint":"oss-cn-hangzhou-internal.aliyuncs.com",
"accessid":"LTAIF****5FsE",
"accesskey":"Ccw****iWjv",
"url":"oss://testBucketname/adb_data/",
"delimiter": "\\1",
"null_value": "\\\\N",
"oss_ignore_quote_and_escape": "true",
"ossnull": 2
}';
在創建OSS的CSV格式的外表來讀取Hive TEXT文件時,需注意如下幾點:
Hive TEXT文件的默認列分隔符為
\1
。若您需要通過OSS的CSV格式的外表讀寫Hive TEXT文件,您可以在配置delimiter
參數時將其轉義為\\1
。Hive TEXT文件的默認
NULL
值為\N
。若您需要通過OSS的CSV格式的外表讀寫Hive TEXT文件,您可以在配置null_value
參數時將其轉義為\\\\N
。Hive的其他基本數據類型(如
BOOLEAN
)與AnalyticDB for MySQL的數據類型一一對應,但BINARY
、CHAR(n)
和VARCHAR(n)
類型均對應AnalyticDB for MySQL中的VARCHAR
類型。
OSS分區外表
如果OSS數據源是包含分區的,會在OSS上形成一個分層目錄,類似如下內容:
parquet_partition_classic/
├── p1=2020-01-01
│ ├── p2=4
│ │ ├── p3=SHANGHAI
│ │ │ ├── 000000_0
│ │ │ └── 000000_1
│ │ └── p3=SHENZHEN
│ │ └── 000000_0
│ └── p2=6
│ └── p3=SHENZHEN
│ └── 000000_0
├── p1=2020-01-02
│ └── p2=8
│ ├── p3=SHANGHAI
│ │ └── 000000_0
│ └── p3=SHENZHEN
│ └── 000000_0
└── p1=2020-01-03
└── p2=6
├── p2=HANGZHOU
└── p3=SHENZHEN
└── 000000_0
上述數據中p1為第1級分區,p2為第2級分區,p3為第3級分區。對應這種數據源,一般都希望以分區的模式進行查詢,那么就需要在創建OSS外表時指明分區列。以Parquet格式為例,創建帶有分區的OSS外表的語句如下:
CREATE TABLE [IF NOT EXISTS] table_name
(column_name column_type[, …])
ENGINE='OSS'
TABLE_PROPERTIES='{
"endpoint":"endpoint",
"url":"OSS_LOCATION",
"accessid":"accesskey_id",
"accesskey":"accesskey_secret",
"format":"parquet",
"partition_column":"p1, p2, p3"
}';
TABLE_PROPERTIES
中的partition_column
參數用于指定分區列(本例中的p1、p2、p3)。且partition_column
參數中的分區列必須按照第1級、第2級、第3級的順序聲明(本例中p1為第1級分區,p2為第2級分區,p3為第3級分區)。列定義中必須定義分區列(本例中的p1、p2、p3)及類型,且分區列需要置于列定義的末尾。
列定義中分區列的先后順序需要與
partition_column
中分區列的順序保持一致。分區列支持的數據類型包括:
BOOLEAN
、TINYINT
、SMALLINT
、INT
、INTEGER
、BIGINT
、FLOAT
、DOUBLE
、DECIMAL
、VARCHAR
、STRING
、DATE
、TIMESTAMP
。查詢數據時,分區列和其它數據列的展示和用法沒有區別。
不指定format時,默認格式為CSV。
其他參數的詳細說明,請參見參數說明。