我正在尝试将存储在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转换为外部镶木桌的有效数据类型?
我也愿意采用其他更简单的方法。先生?猪?
寻找一种快速,简单且具有最小依赖性的方式来打扰。
由于
答案 0 :(得分:0)
尝试拆分:
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 table 这对我有用......