AnalyticDB for MySQL支援通過外表匯入匯出資料。本文介紹如何通過外表查詢HDFS資料,並將HDFS資料匯入至AnalyticDB for MySQL。
前提條件
AnalyticDB for MySQL叢集核心版本需為3.1.4及以上。
說明請在雲原生資料倉儲AnalyticDB MySQL控制台集群資訊頁面的配寘資訊地區,查看和升級核心版本。
HDFS資料檔案格式需為CSV、Parquet或ORC。
已建立HDFS叢集並在HDFS檔案夾中準備需要匯入的資料,本文樣本中所用檔案夾為
hdfs_import_test_data.csv。已在HDFS叢集中為AnalyticDB for MySQL叢集配置如下服務訪問連接埠:
namenode:用於讀寫檔案系統元資訊。您可以在fs.defaultFS參數中配置連接埠號碼,預設連接埠號碼為8020。詳細配置方式,請參見core-default.xml。
datanode:用於讀寫資料。您可以在dfs.datanode.address參數中配置連接埠號碼,預設連接埠號碼為50010。詳細配置方式,請參見hdfs-default.xml。
AnalyticDB for MySQL數倉版彈性模式已開啟ENI訪問。
重要登入雲原生資料倉儲AnalyticDB MySQL控制台,在叢集資訊頁面的網路資訊地區,開啟ENI網路開關。
開啟和關閉ENI網路會導致資料庫連接中斷大約2分鐘,無法讀寫。請謹慎評估影響後再開啟或關閉ENI網路。
操作步驟
建立目標資料庫。本樣本中,AnalyticDB for MySQL叢集的目標庫名為
adb_demo。CREATE DATABASE IF NOT EXISTS adb_demo;使用
CREATE TABLE語句在目標庫adb_demo中建立CSV、Parquet或ORC格式的外表。建立目標表。
您可以使用以下語句在目標資料庫
adb_demo中建立一張目標表,用於儲存從HDFS匯入的資料:建立普通外表對應的目標表(本文樣本中目標表名為
adb_hdfs_import_test),文法如下。CREATE TABLE IF NOT EXISTS adb_hdfs_import_test ( uid string, other string ) DISTRIBUTED BY HASH(uid);建立帶分區外表對應的目標表時(本文樣本中目標表名為
adb_hdfs_import_parquet_partition),需要同時在建立語句中定義普通列(如uid和other)和分區列(如p1、p2和p3),文法如下。CREATE TABLE IF NOT EXISTS adb_hdfs_import_parquet_partition ( uid string, other string, p1 date, p2 int, p3 varchar ) DISTRIBUTED BY HASH(uid);
將HDFS中的資料匯入至目標AnalyticDB for MySQL叢集中。
您可以根據業務需要選擇如下幾種方式匯入資料(分區表匯入資料文法與普通表一致,如下樣本中以普通表為例):
(推薦)方式一:使用
INSERT OVERWRITE匯入資料。資料大量匯入,效能好。匯入成功後資料可見,匯入失敗資料會復原,樣本如下。INSERT OVERWRITE adb_hdfs_import_test SELECT * FROM hdfs_import_test_external_table;方式二:使用
INSERT INTO匯入資料。資料插入即時可查,資料量較小時使用,樣本如下。INSERT INTO adb_hdfs_import_test SELECT * FROM hdfs_import_test_external_table;方式三:非同步執行匯入資料,樣本如下。
SUBMIT JOB INSERT OVERWRITE adb_hdfs_import_test SELECT * FROM hdfs_import_test_external_table;返回結果如下。
+---------------------------------------+ | job_id | +---------------------------------------+ | 2020112122202917203100908203303****** | +---------------------------------------+您還可以根據上述
job_id查看非同步任務的狀態,更多詳情,請參見非同步提交匯入任務。
後續步驟
匯入完成後,您可以登入AnalyticDB for MySQL的目標庫adb_demo中,執行如下語句查看並驗證源表資料是否成功匯入至目標表adb_hdfs_import_test中:
SELECT * FROM adb_hdfs_import_test LIMIT 100;建立HDFS外表
建立檔案格式為CSV的外表
語句如下:
CREATE TABLE IF NOT EXISTS hdfs_import_test_external_table ( uid string, other string ) ENGINE='HDFS' TABLE_PROPERTIES='{ "format":"csv", "delimiter":",", "hdfs_url":"hdfs://172.17.***.***:9000/adb/hdfs_import_test_csv_data/hdfs_import_test_data.csv" }';參數
是否必填
說明
ENGINE='HDFS'必填
外表的儲存引擎說明。本樣本使用的儲存引擎為HDFS。
TABLE_PROPERTIESAnalyticDB for MySQL訪問HDFS資料的方式。
format資料檔案的格式。建立CSV格式檔案的外表時需設定為
csv。delimiter定義CSV資料檔案的資料行分隔符號。本樣本使用的分隔字元為英文逗號(,)。
hdfs_urlHDFS叢集中目標資料檔案或檔案夾的絕對位址,需要以
hdfs://開頭。樣本:
hdfs://172.17.***.***:9000/adb/hdfs_import_test_csv_data/hdfs_import_test_data.csvpartition_column選填
定義外表的分區列,用英文逗號(,)切分各列。定義分區列的方法,請參見建立帶分區的HDFS外表。
compress_type定義資料檔案的壓縮類型,CSV格式的檔案目前僅支援Gzip壓縮類型。
skip_header_line_count定義匯入資料時需要在開頭跳過的行數。CSV檔案第一行為表頭,若設定該參數為1,匯入資料時可自動跳過第一行的表頭。
預設為0,即不跳過。
hdfs_ha_host_port如果HDFS叢集配置了HA功能,建立外表時需配置
hdfs_ha_host_port參數,格式為ip1:port1,ip2:port2,參數中的IP與Port是主備namenode的IP與Port。樣本:
192.168.xx.xx:8020,192.168.xx.xx:8021建立HDFS Parquet格式/HDFS ORC格式的外表
以Parquet格式為例,建立HDFS外表語句如下:
CREATE TABLE IF NOT EXISTS hdfs_import_test_external_table ( uid string, other string ) ENGINE='HDFS' TABLE_PROPERTIES='{ "format":"parquet", "hdfs_url":"hdfs://172.17.***.***:9000/adb/hdfs_import_test_parquet_data/" }';參數
是否必填
說明
ENGINE='HDFS'必填
外表的儲存引擎說明。本樣本使用的儲存引擎為HDFS。
TABLE_PROPERTIESAnalyticDB for MySQL訪問HDFS資料的方式。
format資料檔案的格式。
建立Parquet格式檔案的外表時需設定為
parquet。建立ORC格式檔案的外表時需設定為
orc。
hdfs_urlHDFS叢集中目標資料檔案或檔案夾的絕對位址,需要以
hdfs://開頭。partition_column選填
定義表的分區列,用英文逗號(,)切分各列。定義分區列的方法,請參見建立帶分區的HDFS外表。
hdfs_ha_host_port如果HDFS叢集配置了HA功能,建立外表時需配置
hdfs_ha_host_port參數,格式為ip1:port1,ip2:port2,參數中的IP與Port是主備namenode的IP與Port。樣本:
192.168.xx.xx:8020,192.168.xx.xx:8021說明外表建立語句中的列名需與Parquet或ORC檔案中該列的名稱完全相同(可忽略大小寫),且列的順序需要一致。
建立外表時,可以僅選擇Parquet或ORC檔案中的部分列作為外表中的列,未被選擇的列不會被匯入。
如果建立外表建立語句中出現了Parquet或ORC檔案中不存在的列,針對該列的查詢結果均會返回NULL。
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
FIXED_LEN_BYTE_ARRAY
BINARY
INT64
INT32
DECIMAL
DECIMAL
BINARY
UTF-8
VARCHAR
STRING
JSON(如果已知Parquet該列內容為JSON格式)
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
BINARY
STRING
VARCHAR
VARCHAR
STRING
JSON(如果已知ORC該列內容為JSON格式)
TIMESTAMP
TIMESTAMP或DATETIME
DATE
DATE
重要ORC格式外表暫不支援
LIST、STRUCT和UNION等複合類型,會導致建表失敗。ORC格式外表的列使用MAP類型可以建表,但ORC的查詢會失敗。
建立帶分區的HDFS外表
HDFS支援對Parquet、CSV和ORC檔案格式的資料進行分區,包含分區的資料會在HDFS上形成一個分層目錄。在下方樣本中,p1為第1級分區,p2為第2級分區,p3為第3級分區:
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以Parquet格式為例,建立外表時指定列的建表語句樣本如下:
CREATE TABLE IF NOT EXISTS hdfs_parquet_partition_table
(
uid varchar,
other varchar,
p1 date,
p2 int,
p3 varchar
)
ENGINE='HDFS'
TABLE_PROPERTIES='{
"hdfs_url":"hdfs://172.17.***.**:9000/adb/parquet_partition_classic/",
"format":"parquet", //如需建立CSV或ORC格式外表,僅需將format的取值改為csv或orc。
"partition_column":"p1, p2, p3" //針對包含分區的HDFS資料,如需以分區的模式進行查詢,那麼在匯入資料至AnalyticDB MySQL時就需要在外表建立語句中指定分區列partition_column。
}';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。
其他參數的詳細說明,請參見參數說明。