您可以通过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 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)、覆盖(OVERWRITE)表或者分区数据。

参数解释

  • table_name:需要插入数据的目标表名称。目标表需要提前创建,目标表的Schema需要和外部数据格式一致。
  • LOAD INTO:直接向表或分区中追加数据。
  • LOAD OVERWRITE:先清空表或分区中的原有数据,再向表或分区中插入数据。
  • SORTED BY:指定StorageHandler名称。使用方法和MaxCompute外部表一致,详情请参见内置Extractor访问OSS
  • STORED AS:指定导入数据文件格式,例如ORC、PARQUET、RCFILE、SEQUENCEFILE、TEXTFILE等。使用方法和MaxCompute外部表一致,请参见处理OSS的开源格式数据
  • ROW FORMAT SERDE:非必选选项,只有在使用一些特殊的格式(例如TEXTFILE)时才需要使用。使用方法和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模式授权

示例

  • 将文本文件导入目标表。
    LOAD overwrite table tsv_load_tbl 
    from
    LOCATION 'oss://accessId:accesssKey@oss-cn-hangzhou-zmf.aliyuncs.com/my_bucket_id/my_location/'
    STORED BY 'com.aliyun.odps.TsvStorageHandler'
    WITH SERDEPROPERTIES ('delimiter'='\t');
  • 将开源格式数据导入目标表。
    --创建目标表oss_load_static_part。
    CREATE TABLE oss_load_static_part (
      c_int bigint,
      c_double double,
      c_string string,
      c_bool boolean,
      c_datetime string )
    partitioned by (ds string);
    --将OSS上的开源数据导入目标表。
    LOAD overwrite table oss_load_static_part partition(ds='20190101')
    from
    LOCATION 'oss://<yourAccessKeyId>:<yourAccessKeySecret>@oss-cn-hangzhou-zmf.aliyuncs.com/my_bucket_id/my_location/'
    STORED AS PARQUET;
    说明 将数据LOAD到分区表,外部路径下数据的Schema不包含分区列。如上例中,外部路径数据中只包含c_int、c_double、c_datetime、c_string、c_bool列。
  • 将数据按动态分区方式导入目标表。
    如果OSS表目录下的子目录是以Partition Name方式组织的,则可以将数据按动态分区的方式导入到分区表。
    --OSS表目录的组织方式如下。外部路径的数据中不包含分区列,分区列信息为路径的一部分。
    oss://${accessKeyId}:${accessKeySecret}@oss-cn-hangzhou-zmf.aliyuncs.com/bucket/text_data/ds=20170102/'
    oss://${accessKeyId}:${accessKeySecret}@oss-cn-hangzhou-zmf.aliyuncs.com/bucket/text_data/ds=20170103/'
    --创建目标表oss_load_dyn_part。
    CREATE TABLE oss_load_dyn_part (
      int bigint,
      c_double double,
      c_string string,
      c_bool boolean)
    PARTITIONED BY (ds string);
    --将数据按照动态分区的方式导入目标表。
    LOAD overwrite table oss_load_dyn_part partition(ds)
    from
    LOCATION 'oss://accessId:accesssKey@oss-cn-hangzhou-zmf.aliyuncs.com/bucket/text_data/'
    ROW FORMAT serde 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
    WITH SERDEPROPERTIES(
      'Fields terminator'='\001',
      'Escape delimitor'='\\',
      'Collection items terminator'='\002',
      'Map keys terminator'='\003',
      'Lines terminator'='\n',
      'Null defination'='\\N')
    STORED AS TEXTFILE ;
    上述示例中:
    • LOAD命令中ROW FORMATSERDEPROPERTIES使用默认值时可以省略不写。
    • TEXT数据支持SERDEPROPERTIES,其默认值如下。
      Fields terminator:'\001'
      Escape delimitor:'\\'
      Collection items terminator:'\002'
      Map keys terminator:'\003'
      Lines terminator:'\n'
      Null defination:'\\N'