将avro转换为Parquet地板(可能使用hive?)

cl25kdpy  于 2021-06-21  发布在  Pig
关注(0)|答案(1)|浏览(402)

我正在尝试将一堆存储在hdfs(100gbs)上的多部分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>');

但当我尝试创建Parquet地板table时:

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<…>
是否可以将uniontype转换为外部Parquet表的有效数据类型?
我对其他更简单的方法也持开放态度。先生?Pig?
正在寻找一种快速、简单且依赖性最小的方法。
谢谢

kq0g1dla

kq0g1dla1#

尝试拆分:

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

分为两步:
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表的create语句
替换表名、文件格式和表的位置
运行新的create语句。
这对我有用。。。

相关问题