提问者:小点点

无效的拼花蜂巢架构:重复的组数组


我们生产Hadoop集群上的大多数数据集目前都以AVRO SNAPPY格式存储。我听说了很多关于Parquet的好东西,想试一试。

我遵循这个网页,更改我们的一个ETL来生成Parquet文件,而不是Avro,作为我们的减速器的输出。我使用ParquetAvro模式来生成最终输出数据,加上快速编解码器。一切正常。所以最终输出的拼花文件应该与我们原始的Avro文件具有相同的模式。

现在,我尝试为这些Parquet文件创建一个Hive表。目前,我们使用的IBMBigInsight 3.0包含Hive 12和Parquet1.3.2。根据我们的Avro模式文件,我得出以下HiveDDL:

create table xxx {col1 bigint, col2 string,.................field1 array<struct<sub1:string, sub2:string, date_value:bigint>>,field2 array<struct<..............>>ROW FORMAT SERDE 'parquet.hive.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'parquet.hive.DeprecatedParquetInputFormat' OUTPUTFORMAT 'parquet.hive.DeprecatedParquetOutputFormat' location 'xxxx'

在Hive 12中成功创建了表,我可以“desc table”没有任何问题。但是当我尝试查询表时,比如“select*from table limited 2”,我得到了以下错误:

Caused by: java.lang.RuntimeException: Invalid parquet hive schema: repeated group array { required binary sub1 (UTF8); optional binary sub2 (UTF8); optional int64 date_value;} at parquet.hive.convert.ArrayWritableGroupConverter.<init>(ArrayWritableGroupConverter.java:56) at parquet.hive.convert.HiveGroupConverter.getConverterFromDescription(HiveGroupConverter.java:36) at parquet.hive.convert.DataWritableGroupConverter.<init>(DataWritableGroupConverter.java:61) at parquet.hive.convert.DataWritableGroupConverter.<init>(DataWritableGroupConverter.java:46) at parquet.hive.convert.HiveGroupConverter.getConverterFromDescription(HiveGroupConverter.java:38) at parquet.hive.convert.DataWritableGroupConverter.<init>(DataWritableGroupConverter.java:61) at parquet.hive.convert.DataWritableGroupConverter.<init>(DataWritableGroupConverter.java:40) at parquet.hive.convert.DataWritableRecordConverter.<init>(DataWritableRecordConverter.java:32) at parquet.hive.read.DataWritableReadSupport.prepareForRead(DataWritableReadSupport.java:109) at parquet.hadoop.InternalParquetRecordReader.initialize(InternalParquetRecordReader.java:142) at parquet.hadoop.ParquetRecordReader.initializeInternalReader(ParquetRecordReader.java:118) at parquet.hadoop.ParquetRecordReader.initialize(ParquetRecordReader.java:107) at parquet.hive.MapredParquetInputFormat$RecordReaderWrapper.<init>(MapredParquetInputFormat.java:230) at parquet.hive.MapredParquetInputFormat.getRecordReader(MapredParquetInputFormat.java:119) at org.apache.hadoop.hive.ql.exec.FetchOperator.getRecordReader(FetchOperator.java:439) at org.apache.hadoop.hive.ql.exec.FetchOperator.getNextRow(FetchOperator.java:522) ... 14 more

我注意到错误来自第一个嵌套的结构体列数组。我的问题如下:

  1. Parquet是否支持结构体的嵌套数组?
  2. 这只与Parquet1.3.2有关吗?我对Parquet1.3.2有什么解决方案吗?
  3. 如果我必须使用更高版本的Parquet来解决上述问题,如果Parquet1.3.2在运行时可用,会导致任何问题吗?
  4. 我可以从拼花数据中使用各种Hive功能,例如嵌套结构的“爆炸”吗?

我们正在寻找的是知道镶木地板是否可以像我们目前使用AVRO一样使用,但是给我们提供了AVRO所缺少的柱状存储优势。


共1个答案

匿名用户

看起来Hive 12无法支持parquet文件的嵌套结构,如此Jira工单所示。

https://issues.apache.org/jira/browse/HIVE-8909