本文为您介绍如何通过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不包含分区列。上述示例中,外部路径数据只包含业务字段,不包含分区列。