将 avro 转换为镶木地板(也许使用 hive?)
Posted
技术标签:
【中文标题】将 avro 转换为镶木地板(也许使用 hive?)【英文标题】:Converting avro to parquet (using hive maybe?) 【发布时间】:2016-12-02 21:30:19 【问题描述】:我正在尝试将存储在 HDFS(100 GB)上的一堆多部分 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'
它会抛出一个错误:
FAILED:执行错误,从 org.apache.hadoop.hive.ql.exec.DDLTask 返回代码 1。 java.lang.UnsupportedOperationException:未知字段类型:uniontype<...>
是否可以将 uniontype 转换为外部 parquet 表的有效数据类型?
我也愿意接受其他更简单的方法。先生?猪?
寻找一种快速、简单且需要考虑的依赖项最少的方法。
谢谢
【问题讨论】:
检查联合是一个真正的联合还是只是null
和一个单一的真正类型的联合。后者只是表示一个可选值,您可以在 Parquet 中使用 optional
关键字而不是联合来表示相同的类型。
@Zoltan 这是一个真正的联合,但即使我能够使用 hive 从其中选择一些字段然后写入 Parquet 也可以。横向视图 explode() 在包含联合类型的数组字段上也失败。
【参考方案1】:
尝试拆分这个:
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语句
替换表名、文件格式和表位置
运行新的创建语句。
这对我有用...
【讨论】:
创建外部表查询失败:失败:SemanticException [错误 10043]:应指定列列表或自定义序列化程序。我尝试添加 'like as_avro' 并引发此错误:失败:执行错误,从 org.apache.hadoop.hive.ql.exec.DDLTask 返回代码 1。 java.lang.UnsupportedOperationException:未知字段类型:uniontype<..> 它仍然抛出错误:FAILED: ParseException line 29:1018 cannot identify input near 'void' ',' 'struct' in column type 您是否尝试过复制现有表创建语句并仅更改名称、文件格式和位置的提示? 是的,我就是这么做的 如果你可以发布你正在运行的创建语句,我会检查它以上是关于将 avro 转换为镶木地板(也许使用 hive?)的主要内容,如果未能解决你的问题,请参考以下文章