我正在尝试将存储在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个步骤:
CREATE EXTERNAL TABLE as_parquet (col1 col1_type, ... , coln coln_type) STORED AS parquet LOCATION 'hdfs:///xyz.parquet';
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表的创建语句 - 替换表名称,文件格式和表的位置
- 运行新的创建语句。
这对我有用...