将Avro转换为Parquet(也许是使用蜂巢?)



我正在尝试将存储在HDFS(100 gbs)上的一堆多部分的AVRO文件转换为Parquet文件(保留所有数据)

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; ...>

是否可以将UnionType转换为外部镶木表的有效数据类型的东西?

我也接受替代,更简单的方法。先生?猪?

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

谢谢

尝试拆分以下:

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

分2个步骤:

  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;

或,如果您有分区,我想您对此数据有很多:

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表的创建语句
  • 替换表名称,文件格式和表的位置
  • 运行新的创建语句。

这对我有用...

相关内容

最新更新