如果您需要將外部存儲上的數據導入MaxCompute的表或表的分區中,可以通過LOAD命令實現該操作。本文為您介紹如何使用LOAD命令將外部存儲上的CSV格式或其他開源格式數據導入MaxCompute。
本文中的命令您可以在如下工具平臺執行:
功能介紹
MaxCompute支持使用load overwrite
或load into
命令將Hologres、OSS、Amazon Redshift、BigQuery外部存儲的CSV格式或其他開源格式數據導入MaxCompute的表或表的分區。其中:
Amazon Redshift和BigQuery的數據需要先導入OSS,才可以通過OSS導入MaxCompute。
MaxCompute支持將數據按照動態分區方式導入MaxCompute的分區表的分區。
load into
命令會直接向表或分區中追加數據。load overwrite
命令會先清空表或分區中的原有數據,再向表或分區中插入數據。
使用限制
當前只支持將外部存儲的數據導入至同區域的MaxCompute項目空間中。
通過OSS導入數據時:
導入到目標MaxCompute分區表時,目標表的Schema(除分區列)需要和外部數據格式一致,且外部數據的Schema不包含分區列。
通過Hologres導入數據時:
不支持將Hologres分區表數據導入MaxCompute。
不支持使用雙簽名授權模式的Hologres外表導入數據至MaxCompute。
前提條件
操作賬號已具備MaxCompute的相關權限。
執行
load
操作前,操作賬號需要具備MaxCompute項目空間創建表權限(CreateTable)及修改表權限(Alter)。授權操作請參見MaxCompute權限。操作賬號已具備外部存儲數據對應數據源的相關權限。
向MaxCompute導入外部存儲數據前,您需要先對MaxCompute進行授權,允許MaxCompute訪問外部存儲(OSS或Hologres)。
load overwrite
或load into
命令的授權模式沿用了MaxCompute外部表的授權模式,OSS和Hologres的授權引導如下。外部存儲:OSS
您可以一鍵授權,具備更高安全性。詳情請參見STS模式授權。
外部存儲:Hologres
您可創建一個RAM角色,為其授權允許MaxCompute訪問的權限,并將角色添加至Hologres實例,完成授權,操作詳情請參見創建Hologres外部表(STS模式)。
完成上述授權的前期準備后,您需要根據導入數據的格式類型,選擇對應的導入方式:
通過內置Extractor(StorageHandler)導入數據
命令格式
{load overwrite|into} table <table_name> [partition (<pt_spec>)] from location <external_location> stored by <StorageHandler> [with serdeproperties (<Options>)];
參數說明
外部存儲:OSS
table_name:必填。需要插入數據的目標表名稱。目標表需要提前創建,目標表的Schema(除分區列)需要和外部數據格式一致。
pt_spec:可選。需要插入數據的目標表分區信息。格式為
(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)
。external_location:必填。指定讀取外部存儲數據的OSS目錄,格式為
'oss://<oss_endpoint>/<object>'
,詳情請參見OSS訪問域名使用規則,系統會默認讀取該目錄下所有的文件。StorageHandler:必填。指定內置的StorageHandler名稱。
com.aliyun.odps.CsvStorageHandler
是內置的處理CSV格式文件的StorageHandler,定義了如何讀或寫CSV文件。您只需要指定該參數,相關邏輯已經由系統實現。使用方法和MaxCompute外部表一致,詳情請參見創建OSS外部表。Options:可選。指定外部表相關參數,SERDEPROPERTIES支持的屬性和MaxCompute外部表一致,屬性列表詳情請參見創建OSS外部表。
外部存儲:Hologres
table_name:必填。需要插入數據的目標表名稱。目標表需要提前創建,目標表的Schema(除分區列)需要和外部數據格式一致。
pt_spec:可選。需要插入數據的目標表分區信息。格式為
(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)
。external_location:必填。指定Hologres的JDBC連接地址,格式為
'<jdbc:postgresql://<endpoint>:<port>/<database>?ApplicationName=MaxCompute&[currentSchema=<schema>&][useSSL={true|false}&]table=<holo_table_name>/>'
。endpoint:必填。Hologres實例的經典網絡域名。獲取方式,請參見實例配置。
port:必填。Hologres實例的網絡端口。獲取方式,請參見實例配置。
database:必填。連接的Hologres數據庫名稱。更多Hologres數據庫信息,請參見CREATE DATABASE。
ApplicationName:必填。默認為MaxCompute,無需修改。
schema:可選。如果表名在Hologres數據庫內是唯一的,或源表是默認Schema中的表,可以不配置該屬性。更多Schema信息,請參見CREATE SCHEMA。
holo_table_name:必填。Hologres源表名稱。更多Hologres源表信息,請參見建表概述。
StorageHandler:必填。定義了如何查詢Hologres外部表。固定取值為
com.aliyun.odps.jdbc.JdbcStorageHandler
,使用JdbcStorageHandler連接方式。Options:可選。指定外部表相關參數,SERDEPROPERTIES支持的屬性和MaxCompute外部表一致。
mcfed.mapreduce.jdbc.driver.class:必填。指定連接Hologres數據庫的驅動程序。固定取值為
org.postgresql.Driver
。odps.federation.jdbc.target.db.type:必填。指定連接的數據庫類型。固定取值為
holo
。odps.federation.jdbc.colmapping:可選。如果需要將指定數據源的部分列映射至Hologres外部表,需要配置該參數,指定Hologres源表的字段和Hologres外部表字段的映射關系。如果不配置該參數,按照源表字段順序映射至Hologres外部表。如果Hologres里的字段名稱是大寫的話,需要為Hologres字段名稱添加雙引號("")。格式為:
MaxCompute字段1 : "Hologres字段1" [,MaxCompute字段2 : "Hologres字段2" ,...]
。
使用示例
外部存儲:OSS
通過內置Extractor(StorageHandler)導入數據。假設MaxCompute和OSS的Owner是同一個賬號,通過阿里云內網將vehicle.csv文件的數據導入MaxCompute。
將vehicle.csv文件保存至OSS Bucket目錄下
mc-test/data_location/
,地域為oss-cn-hangzhou
,并組織OSS目錄路徑。創建OSS Bucket詳情請參見創建存儲空間。vehicle.csv文件數據如下:
1,1,51,1,46.81006,-92.08174,9/14/2014 0:00,S 1,2,13,1,46.81006,-92.08174,9/14/2014 0:00,NE 1,3,48,1,46.81006,-92.08174,9/14/2014 0:00,NE 1,4,30,1,46.81006,-92.08174,9/14/2014 0:00,W 1,5,47,1,46.81006,-92.08174,9/14/2014 0:00,S 1,6,9,1,46.81006,-92.08174,9/14/2014 0:00,S 1,7,53,1,46.81006,-92.08174,9/14/2014 0:00,N 1,8,63,1,46.81006,-92.08174,9/14/2014 0:00,SW 1,9,4,1,46.81006,-92.08174,9/14/2014 0:00,NE 1,10,31,1,46.81006,-92.08174,9/14/2014 0:00,N
根據Bucket、地域、Endpoint信息組織OSS目錄路徑如下:
oss://oss-cn-hangzhou-internal.aliyuncs.com/mc-test/data_location/
登錄MaxCompute客戶端創建目標表ambulance_data_csv_load。命令示例如下:
create table ambulance_data_csv_load ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongtitue DOUBLE, recordTime STRING, direction STRING );
執行
load overwrite
命令,將OSS上的vehicle.csv文件導入目標表。命令示例如下:load overwrite table ambulance_data_csv_load from location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/mc-test/data_location/' stored by 'com.aliyun.odps.CsvStorageHandler' with serdeproperties ( 'odps.properties.rolearn'='acs:ram::xxxxx:role/aliyunodpsdefaultrole', --AliyunODPSDefaultRole的ARN信息,可通過RAM角色管理頁面獲取。 'odps.text.option.delimiter'=',' );
查看角色的ARN信息請參見查看RAM角色。
查看目標表ambulance_data_csv_load的導入結果。命令示例如下:
--開啟全表掃描,僅此Session有效。 set odps.sql.allow.fullscan=true; select * from ambulance_data_csv_load;
返回結果如下:
+------------+------------+------------+------------+------------------+-------------------+------------+------------+ | vehicleid | recordid | patientid | calls | locationlatitute | locationlongtitue | recordtime | direction | +------------+------------+------------+------------+------------------+-------------------+------------+------------+ | 1 | 1 | 51 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | S | | 1 | 2 | 13 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | NE | | 1 | 3 | 48 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | NE | | 1 | 4 | 30 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | W | | 1 | 5 | 47 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | S | | 1 | 6 | 9 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | S | | 1 | 7 | 53 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | N | | 1 | 8 | 63 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | SW | | 1 | 9 | 4 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | NE | | 1 | 10 | 31 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | N | +------------+------------+------------+------------+------------------+-------------------+------------+------------+
外部存儲:Hologres
示例場景
已創建Hologres實例及數據庫,并創建一張表;已在MaxCompute創建了一個Hologres外部表,通過外部表查詢已創建的Hologres表數據如下。
--查詢holo外表: select * from mf_holo_ext4; --返回 +------------+------+ | id | name | +------------+------+ | 1 | abc | | 2 | ereg | +------------+------+
通過LOAD命令將此Hologres表數據導入MaxCompute內表操作示例。
創建一個MaxCompute內表。
--創建內表 create table mf_from_holo(id bigint,name string);
通過LOAD命令導入數據至MaxCompute。
--load holo表數據到mc內表 load into table mf_from_holo from location 'jdbc:postgresql://hgprecn-cn-wwo3ft0l****-cn-beijing-internal.hologres.aliyuncs.com:80/mf_db?application_name=MaxCompute¤tSchema=public&useSSL=false&table=mf_holo/' stored by 'com.aliyun.odps.jdbc.JdbcStorageHandler' with serdeproperties ( 'odps.properties.rolearn'='acs:ram::18927322887*****:role/hologressrole', 'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 'odps.federation.jdbc.target.db.type'='holo' );
查詢導入結果。
select * from mf_from_holo; --返回 +------------+------+ | id | name | +------------+------+ | 2 | ereg | | 1 | abc | +------------+------+
導入其他開源格式數據
命令格式
{load overwrite|into} table <table_name> [partition (<pt_spec>)] from location <external_location> [row format serde '<serde_class>' [with serdeproperties (<Options>)] ] stored as <file_format>;
參數說明
table_name:必填。需要插入數據的目標表名稱。目標表需要提前創建,目標表的Schema(除分區列)需要和外部數據格式一致。
pt_spec:可選。需要插入數據的目標表分區信息。格式為
(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)
。external_location:必填。指定讀取外部存儲數據的OSS目錄,格式為
'oss://<oss_endpoint>/<object>'
,詳情請參見OSS訪問域名使用規則,系統會默認讀取該目錄下所有的文件。serde_class:可選。使用方法和MaxCompute外部表一致,詳情請參見創建OSS外部表。
Options:必填。指定外部表相關參數,SERDEPROPERTIES支持的屬性和MaxCompute外部表一致,屬性列表詳情請參見創建OSS外部表。
file_format:必填。指定導入數據文件格式。例如ORC、PARQUET、RCFILE、SEQUENCEFILE和TEXTFILE。使用方法和MaxCompute外部表一致,詳情請參見創建OSS外部表。
說明serde_class
和Options
使用默認值時,可以省略不寫。導入的單個文件大小不能超過3 GB,如果文件過大,建議拆分。
使用示例
示例1:導入其他開源格式數據。假設MaxCompute和OSS的Owner是同一個賬號,通過阿里云內網將vehicle.textfile文件的數據導入MaxCompute。
說明若MaxCompute和OSS的Owner不是同一個賬號,授權方式可參見OSS的STS模式授權。
將vehicle.txtfile文件保存至OSS Bucket目錄下
mc-test/data_location/
,地域為oss-cn-hangzhou
,并組織OSS目錄路徑。創建OSS Bucket詳情請參見創建存儲空間。vehicle.textfile文件數據如下:
1,1,51,1,46.81006,-92.08174,9/14/2014 0:00,S 1,2,13,1,46.81006,-92.08174,9/14/2014 0:00,NE 1,3,48,1,46.81006,-92.08174,9/14/2014 0:00,NE 1,4,30,1,46.81006,-92.08174,9/14/2014 0:00,W 1,5,47,1,46.81006,-92.08174,9/14/2014 0:00,S 1,6,9,1,46.81006,-92.08174,9/14/2014 0:00,S 1,7,53,1,46.81006,-92.08174,9/14/2014 0:00,N 1,8,63,1,46.81006,-92.08174,9/14/2014 0:00,SW 1,9,4,1,46.81006,-92.08174,9/14/2014 0:00,NE 1,10,31,1,46.81006,-92.08174,9/14/2014 0:00,N
根據Bucket、地域、Endpoint信息組織OSS目錄路徑如下:
oss://oss-cn-hangzhou-internal.aliyuncs.com/mc-test/data_location/
登錄MaxCompute客戶端創建目標表ambulance_data_textfile_load_pt。命令示例如下:
create table ambulance_data_textfile_load_pt ( vehicleId STRING, recordId STRING, patientId STRING, calls STRING, locationLatitute STRING, locationLongtitue STRING, recordTime STRING, direction STRING) partitioned by (ds STRING);
執行
load overwrite
命令,將OSS上的vehicle.textfile文件導入目標表。命令示例如下:load overwrite table ambulance_data_textfile_load_pt partition(ds='20200910') from location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/mc-test/data_location/' row format serde 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' stored as textfile;
查看目標表ambulance_data_textfile_load_pt的導入結果。命令示例如下:
--開啟全表掃描,僅此Session有效。 set odps.sql.allow.fullscan=true; select * from ambulance_data_textfile_load_pt;
返回結果如下:
+------------+------------+------------+------------+------------------+-------------------+------------+------------+------------+ | vehicleid | recordid | patientid | calls | locationlatitute | locationlongtitue | recordtime | direction | ds | +------------+------------+------------+------------+------------------+-------------------+------------+------------+------------+ | 1,1,51,1,46.81006,-92.08174,9/14/2014 0:00,S | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 20200910 | | 1,2,13,1,46.81006,-92.08174,9/14/2014 0:00,NE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 20200910 | | 1,3,48,1,46.81006,-92.08174,9/14/2014 0:00,NE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 20200910 | | 1,4,30,1,46.81006,-92.08174,9/14/2014 0:00,W | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 20200910 | | 1,5,47,1,46.81006,-92.08174,9/14/2014 0:00,S | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 20200910 | | 1,6,9,1,46.81006,-92.08174,9/14/2014 0:00,S | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 20200910 | | 1,7,53,1,46.81006,-92.08174,9/14/2014 0:00,N | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 20200910 | | 1,8,63,1,46.81006,-92.08174,9/14/2014 0:00,SW | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 20200910 | | 1,9,4,1,46.81006,-92.08174,9/14/2014 0:00,NE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 20200910 | | 1,10,31,1,46.81006,-92.08174,9/14/2014 0:00,N | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 20200910 | +------------+------------+------------+------------+------------------+-------------------+------------+------------+------------+
示例2:將數據按動態分區方式導入目標表。
說明如果OSS目錄下的子目錄是以分區名方式組織的,則可以將數據按動態分區的方式導入到分區表。
將vehicle1.csv文件和vehicle2.csv文件分別保存至OSS Bucket目錄
mc-test/data_location/ds=20200909/
和mc-test/data_location/ds=20200910/
,地域為oss-cn-hangzhou
,并組織OSS目錄路徑。創建OSS Bucket詳情請參見創建存儲空間。vehicle1.csv文件和vehicle2.csv文件數據如下:
--vehicle1.csv 1,1,51,1,46.81006,-92.08174,9/14/2014 0:00,S 1,2,13,1,46.81006,-92.08174,9/14/2014 0:00,NE 1,3,48,1,46.81006,-92.08174,9/14/2014 0:00,NE 1,4,30,1,46.81006,-92.08174,9/14/2014 0:00,W 1,5,47,1,46.81006,-92.08174,9/14/2014 0:00,S 1,6,9,1,46.81006,-92.08174,9/14/2014 0:00,S --vehicle2.csv 1,7,53,1,46.81006,-92.08174,9/14/2014 0:00,N 1,8,63,1,46.81006,-92.08174,9/14/2014 0:00,SW 1,9,4,1,46.81006,-92.08174,9/14/2014 0:00,NE 1,10,31,1,46.81006,-92.08174,9/14/2014 0:00,N
根據Bucket、地域、Endpoint信息組織OSS目錄路徑如下:
oss://oss-cn-hangzhou-internal.aliyuncs.com/mc-test/data_location/ds=20200909/' oss://oss-cn-hangzhou-internal.aliyuncs.com/mc-test/data_location/ds=20200910/'
登錄MaxCompute客戶端創建目標表ambulance_data_csv_load_dynpt。命令示例如下:
create table ambulance_data_csv_load_dynpt ( vehicleId STRING, recordId STRING, patientId STRING, calls STRING, locationLatitute STRING, locationLongtitue STRING, recordTime STRING, direction STRING) partitioned by (ds STRING);
執行
load overwrite
命令,將OSS上的文件導入目標表。命令示例如下:load overwrite table ambulance_data_csv_load_dynpt partition(ds) from location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/mc-test/data_location/' row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde' stored as textfile;
查看目標表ambulance_data_csv_load_dynpt的導入結果。命令示例如下:
--開啟全表掃描,僅此Session有效。 set odps.sql.allow.fullscan=true; select * from ambulance_data_csv_load_dynpt;
返回結果如下:
+------------+------------+------------+------------+------------------+-------------------+------------+------------+------------+ | vehicleid | recordid | patientid | calls | locationlatitute | locationlongtitue | recordtime | direction | ds | +------------+------------+------------+------------+------------------+-------------------+------------+------------+------------+ | 1 | 7 | 53 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | N | 20200909 | | 1 | 8 | 63 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | SW | 20200909 | | 1 | 9 | 4 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | NE | 20200909 | | 1 | 10 | 31 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | N | 20200909 | | 1 | 1 | 51 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | S | 20200910 | | 1 | 2 | 13 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | NE | 20200910 | | 1 | 3 | 48 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | NE | 20200910 | | 1 | 4 | 30 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | W | 20200910 | | 1 | 5 | 47 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | S | 20200910 | | 1 | 6 | 9 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | S | 20200910 | +------------+------------+------------+------------+------------------+-------------------+------------+------------+------------+
相關文檔
若您希望將MaxCompute項目中的數據導出到外部存儲(OSS、Hologres),以供其他計算引擎使用,請參見UNLOAD。