本文为您介绍如何通过LOAD命令将外部存储(例如OSS)数据导入表或表分区。
注意事项
使用外部存储数据前,请您对MaxCompute进行授权。LOAD命令的授权沿用了MaxCompute外部表的授权模式,授权方式有如下两种:
- 使用LOAD命令时,在数据路径中直接指定AccessKey ID和AccessKey Secret。以OSS为例,指定方式如下。
'oss://<yourAccessKeyId>:<yourAccessKeySecret>@oss-cn-hangzhou-zmf.aliyuncs.com/my_bucket_id/my_location/'
说明 此方式会在授权时明文显示AccessKey ID和AccessKey Secret,存在一定安全隐患,不建议您使用。 - STS模式授权。
通过Extractor(StorageHandler)导入数据
- 命令格式
LOAD OVERWRITE|INTO TABLE table_name [PARTITION(partcol1=val1, partcol2=val2 ...)] FROM LOCATION external_location [STORED BY StorageHandler] [WITH SERDEPROPERTIES (Options)];
- 参数解释
- LOAD INTO:直接向表或分区中追加数据。
- LOAD OVERWRITE:先清空表或分区中的原有数据,再向表或分区中插入数据。
- table_name:需要插入数据的目标表名称。目标表需要提前创建,目标表的Schema需要和外部数据格式一致。
- LOCATION:指定需要读取数据的OSS目录,系统会默认读取该目录下所有的文件。
- SORTED BY:指定StorageHandler名称。使用方法和MaxCompute外部表一致,详情请参见内置Extractor访问OSS。
- WITH SERDEPROPERTIES:指定外部表相关参数,SERDEPROPERTIES支持的属性和MaxCompute外部表一致,属性列表详情请参见内置Extractor访问OSS。
- 示例
假设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
LOAD命令示例如下。--将vehicle.csv文件保存至OSS Bucket目录下,并获取OSS表目录的组织方式如下。 oss://${accessKeyId}:${accessKeySecret}@oss-cn-hangzhou-zmf.aliyuncs.com/bucket/data_location/ --创建目标表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 ); --将OSS上的CSV文件导入目标表。 LOAD OVERWRITE TABLE ambulance_data_csv_load FROM LOCATION 'oss://oss-cn-hangzhou-zmf.aliyuncs.com/bucket/data_location/' STORED BY 'com.aliyun.odps.CsvStorageHandler' WITH SERDEPROPERTIES ( 'odps.properties.rolearn'='acs:ram::xxxxx:role/aliyunodpsdefaultrole', --AliyunODPSDefaultRole的ARN信息 'odps.text.option.delimiter'=',' );
导入开源格式数据
- 命令格式
LOAD OVERWRITE|INTO TABLE table_name [PARTITION(partcol1=val1, partcol2=val2 ...)] FROM LOCATION external_location [ROW FORMAT SERDE '<serde class>' [WITH SERDEPROPERTIES ('odps.properties.rolearn'='${roleran}' [,'name2'='value2',...])] ] STORED AS <file format>;
- 参数解释
- LOAD INTO:直接向表或分区中追加数据。
- LOAD OVERWRITE:先清空表或分区中的原有数据,再向表或分区中插入数据。
- table_name:需要插入数据的目标表名称。目标表需要提前创建,目标表的Schema需要和外部数据格式一致。
- ROW FORMAT SERDE:非必选项,使用方法和MaxCompute外部表一致,详情请参见处理OSS的开源格式数据。
不同文件格式对应的默认serde class如下:
SEQUENCEFILE: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
TEXTFILE: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
RCFILE: org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe
ORC: org.apache.hadoop.hive.ql.io.orc.OrcSerde
ORCFILE: org.apache.hadoop.hive.ql.io.orc.OrcSerde
PARQUET: org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe
AVRO: org.apache.hadoop.hive.serde2.avro.AvroSerDe
- SERDEPROPERTIES:当MaxCompute使用STS模式授权时,通过该参数指定
odps.properties.rolearn
的属性值,属性值为RAM中AliyunODPSDefaultRole的ARN信息。详情请参见STS模式授权。当MaxCompute和OSS的Owner是同一个账号时,可一键授权。其他各类开源数据对应的SERDEPROPERTIES详情请参见处理OSS的开源格式数据。 - STORED AS:指定导入数据文件格式。例如ORC、PARQUET、RCFILE、SEQUENCEFILE和TEXTFILE。使用方法和MaxCompute外部表一致,详情请参见处理OSS的开源格式数据。
- 示例
--OSS表目录的组织方式如下。外部路径的数据中不包含分区列,分区列信息为路径的一部分。 oss://${accessKeyId}:${accessKeySecret}@oss-cn-hangzhou-zmf.aliyuncs.com/bucket/data_location/ds=20200910/' --创建目标表ambulance_data_csv_load_pt。 CREATE TABLE ambulance_data_csv_load_pt ( vehicleId STRING, recordId STRING, patientId STRING, calls STRING, locationLatitute STRING, locationLongtitue STRING, recordTime STRING, direction STRING) PARTITIONED BY (ds STRING); --将OSS上的开源数据导入目标表。 LOAD OVERWRITE TABLE ambulance_data_csv_load_pt PARTITION(ds='20200910') FROM LOCATION 'oss://<yourAccessKeyId>:<yourAccessKeySecret>@oss-cn-hangzhou-zmf.aliyuncs.com/bucket/data_location/' ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' STORED AS TEXTFILE;
说明 将数据下载到分区表,外部路径下数据的Schema不包含分区列。上述示例中,外部路径数据只包含业务字段,不包含分区列。
在文档使用中是否遇到以下问题
更多建议
匿名提交