我正在尝试将一堆存储在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?
正在寻找一种快速、简单且依赖性最小的方法。
谢谢
1条答案
按热度按时间kq0g1dla1#
尝试拆分:
分为两步:
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语句。
这对我有用。。。