全部產品
Search
文件中心

AnalyticDB:通過外表匯入至數倉版

更新時間:Jul 06, 2024

AnalyticDB MySQL版支援通過外表匯入匯出資料。本文介紹如何通過外表查詢HDFS資料,並將HDFS資料匯入至AnalyticDB MySQL數倉版

前提條件

  • AnalyticDB MySQL版叢集需為V3.1.4.4或以上版本。

    說明

    如何查看叢集核心版本,請參見如何查看執行個體版本資訊。如需升級核心版本,請聯絡支援人員。

  • HDFS資料檔案格式需為CSV、Parquet或ORC。

  • 已建立HDFS叢集並在HDFS檔案夾中準備需要匯入的資料,本文樣本中所用檔案夾為hdfs_import_test_data.csv

  • 已在HDFS叢集中為AnalyticDB MySQL叢集配置如下服務訪問連接埠:

    • namenode:用於讀寫檔案系統元資訊。您可以在fs.defaultFS參數中配置連接埠號碼,預設連接埠號碼為8020。

      詳細配置方式,請參見core-default.xml

    • datanode:用於讀寫資料。您可以在dfs.datanode.address參數中配置連接埠號碼,預設連接埠號碼為50010。

      詳細配置方式,請參見hdfs-default.xml

  • 如果您的AnalyticDB MySQL叢集是彈性模式,您需要在集群資訊頁面的網路資訊地區,開啟啟用ENI網絡的開關。啟用ENI網路

操作步驟

  1. 串連目標AnalyticDB MySQL叢集。詳細操作步驟,請參見串連叢集

  2. 建立目標資料庫。詳細操作步驟,請參見建立資料庫

    本樣本中,AnalyticDB MySQL叢集的目標庫名為adb_demo

  3. 使用CREATE TABLE語句在目標庫adb_demo中建立CSV、Parquet或ORC格式的外表。

  4. 建立目標表。

    您可以使用以下語句在目標資料庫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),需要同時在建立語句中定義普通列(如uidother)和分區列(如p1p2p3),文法如下。

      CREATE TABLE IF NOT EXISTS adb_hdfs_import_parquet_partition
      (
          uid string,
          other string,
          p1 date,
          p2 int,
          p3 varchar
      )
      DISTRIBUTED BY HASH(uid);
  5. 將HDFS中的資料匯入至目標AnalyticDB 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 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_PROPERTIES

    AnalyticDB MySQL訪問HDFS資料的方式。

    format

    資料檔案的格式。建立CSV格式檔案的外表時需設定為csv

    delimiter

    定義CSV資料檔案的資料行分隔符號。本樣本使用的分隔字元為英文逗號(,)。

    hdfs_url

    HDFS叢集中目標資料檔案或檔案夾的絕對位址,需要以hdfs://開頭。

    樣本:hdfs://172.17.***.***:9000/adb/hdfs_import_test_csv_data/hdfs_import_test_data.csv

    partition_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_PROPERTIES

    AnalyticDB MySQL訪問HDFS資料的方式。

    format

    資料檔案的格式。

    • 建立Parquet格式檔案的外表時需設定為parquet

    • 建立ORC格式檔案的外表時需設定為orc

    hdfs_url

    HDFS叢集中目標資料檔案或檔案夾的絕對位址,需要以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 MySQL版3.0的資料類型映射關係如下表。

    Parquet基本類型

    Parquet的logicalType類型

    AnalyticDB MySQL版3.0的資料類型

    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 MySQL版3.0的資料類型映射關係如下表。

    ORC檔案中的資料類型

    AnalyticDB MySQL版3.0中的資料類型

    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格式外表暫不支援LISTSTRUCTUNION等複合類型,會導致建表失敗。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中分區列的順序保持一致。

  • 可以作為分區列的資料類型有:BOOLEANTINYINTSMALLINTINTINTEGERBIGINTFLOATDOUBLEDECIMALVARCHARSTRINGDATETIMESTAMP

  • 查詢時分區列和其它資料列的表現和用法沒有區別。

  • 不指定format時,預設格式為CSV。