将avro转换为镶木地板(使用配置单元可能吗?)

问题描述 投票:0回答:1

我正在尝试将存储在HDFS(100s的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'

它会抛出一个错误:

FAILED:执行错误,从org.apache.hadoop.hive.ql.exec.DDLTask返回代码1。 java.lang.UnsupportedOperationException:未知字段类型:uniontype <...>

是否可以将uniontype转换为外部镶木桌的有效数据类型?

我也愿意采用其他更简单的方法。先生?猪?

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

谢谢

mapreduce hive apache-pig avro parquet
1个回答
0
投票

尝试拆分:

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

分为两步:

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

这对我有用......

© www.soinside.com 2019 - 2024. All rights reserved.