将avro转换为镶木地板(使用配置单元可能吗?)

时间:2016-12-02 21:30:19

标签: mapreduce hive apache-pig avro parquet

我正在尝试将存储在HDFS(100多GB)上的一堆多部分avro文件转换为镶木地板文件(保留所有数据)

Hive可以使用以下方法将avro文件作为外部表读取:

CREATE EXTERNAL TABLE as_avro 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' 
STORED as INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' 
LOCATION '<location>' 
TBLPROPERTIES ('avro.schema.url'='<schema.avsc>');

但是当我尝试创建一个镶木桌子时:

create external table as_parquet like as_avro stored as parquet location 'hdfs:///xyz.parquet'

它会抛出错误:

  

失败:执行错误,从org.apache.hadoop.hive.ql.exec.DDLTask返回代码1。 java.lang.UnsupportedOperationException:未知字段类型:uniontype&lt; ...&gt;

是否可以将uniontype转换为外部镶木桌的有效数据类型?

我也愿意采用其他更简单的方法。先生?猪?

寻找一种快速,简单且具有最小依赖性的方式来打扰。

由于

1 个答案:

答案 0 :(得分:0)

尝试拆分:

create external table as_parquet like as_avro stored as parquet location 'hdfs:///xyz.parquet'
分为两步:

  1. CREATE EXTERNAL TABLE as_parquet (col1 col1_type, ... , coln coln_type) STORED AS parquet LOCATION 'hdfs:///xyz.parquet';

  2. INSERT INTO TABLE as_parquet SELECT * FROM as_avro;

  3. 或者,如果你有分区,我猜你有这个数据量:

    INSERT INTO TABLE as_parquet PARTITION (year=2016, month=07, day=13) SELECT <all_columns_except_partition_cols> FROM as_avro WHERE year='2016' and month='07' and day='13';

    注意:
    对于第1步,为了在列类型等中保存任何拼写错误或小错误,您可以:

    • 运行SHOW CREATE TABLE as_avro并复制as_avro table
    • 的create语句
    • 替换表名称,文件格式和表格位置
    • 运行新的create语句。

    这对我有用......