Hive 无效的拼花配置单元架构:重复的组数组

Hive 无效的拼花配置单元架构:重复的组数组,hive,avro,parquet,Hive,Avro,Parquet,我们生产的Hadoop集群上的大多数数据集目前都存储为AVRO+SNAPPY格式。我听说了很多关于拼花地板的好东西,我想尝试一下 我随后更改了一个ETL,以生成拼花文件,而不是Avro,作为我们的reducer的输出。我使用Parquet+Avro模式生成最终的输出数据,以及snappy编解码器。一切正常。因此,最终输出的拼花文件应该与原始Avro文件具有相同的模式 现在,我尝试为这些拼花地板文件创建一个配置单元表。目前,我们使用的IBMBigInsight 3.0包含Hive12和Parque

我们生产的Hadoop集群上的大多数数据集目前都存储为AVRO+SNAPPY格式。我听说了很多关于拼花地板的好东西,我想尝试一下

我随后更改了一个ETL,以生成拼花文件,而不是Avro,作为我们的reducer的输出。我使用Parquet+Avro模式生成最终的输出数据,以及snappy编解码器。一切正常。因此,最终输出的拼花文件应该与原始Avro文件具有相同的模式

现在,我尝试为这些拼花地板文件创建一个配置单元表。目前,我们使用的IBMBigInsight 3.0包含Hive12和Parquet 1.3.2。 根据我们的Avro模式文件,我得出以下配置单元DDL:

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'
创建表xxx{col1 bigint,col2 string,…..…field1数组,field2 arrayROW FORMAT SERDE'parquet.hive.SERDE.ParquetHiveSerDe'存储为INPUTFORMAT'parquet.hive.DeprecatedParquetInputFormat'OUTPUTFORMAT'parquet.hive.DeprecatedParquetoutformat'location'xxxx'
在Hive 12中成功创建了表,我可以“desc table”而没有任何问题。但是当我尝试查询表时,如“select*from table limit 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
原因:java.lang.RuntimeException:无效的parquet配置单元架构:parquet.hive.convert.ArrayWritableGroupConverter.java:56处的parquet.hive.convert.HiveGroupConverter.getConverterFromDescription处的重复组数组{required binary sub1(UTF8);可选binary sub2(UTF8);可选int64 date_value;}(HiveGroupConverter.java:36)位于parquet.hive.convert.DataWritableGroupConverter。(DataWritableGroupConverter.java:61)位于parquet.hive.convert.DataWritableGroupConverter。(DataWritableGroupConverter.java:46)位于parquet.hive.convert.HiveGroupConverter.getConverterFromDescription(HiveGroupConverter.java:38)在parquet.hive.convert.DataWritableGroupConverter.(DataWritableGroupConverter.java:61)在parquet.hive.convert.DataWritableGroupConverter.(DataWritableGroupConverter.java:40)在parquet.hive.convert.DataWritableRecordConverter.(DataWritableRecordConverter.java:32)在parquet.hive.read.DataWritableReadSupport.PrepareForead(datawriteablereadsupport.java:109)在parquet.hadoop.InternalParquetRecordReader.initialize(InternalParquetRecordReader.java:142)在parquet.hadoop.ParquetRecordReader.initializeInternalReader(ParquetRecordReader.java:118)在parquet.hadoop.ParquetRecordReader.initialize(ParquetRecordReader.java:107)在parquet.hive.MapredParquetInputFormat$RecordReaderRapper.(MapredParquetInputFormat.java:230)在parquet.hive.MapredParquetInputFormat.getRecordReader(MapredParquetInputFormat.java:119)在org.apache.hadoop.hive.ql.exec.FetchOperator.getRecordReader(FetchOperator.java:439)在org.apache.hadoop.hive.exec.FetchOperator.getNextRow(FetchOperator.java:522)…还有14个
我注意到错误来自结构列的第一个嵌套数组。我的问题如下:

  • 拼花地板是否支持结构的嵌套数组
  • 这仅仅与拼花地板1.3.2有关吗?我对拼花地板1.3.2有什么解决方案吗
  • 如果我必须使用更高版本的Parquet来修复上述问题,并且如果Parquet 1.3.2在运行时可用,这会导致任何问题吗
  • 我可以从拼花地板数据中使用所有类型的蜂巢特征,比如巢结构的“爆炸”吗

  • 我们想要知道的是,拼花地板是否可以像我们目前使用的AVRO一样使用,但它能给我们提供AVRO所缺少的柱状存储优势。

    看起来Hive 12无法支持拼花文件的嵌套结构,如本Jira票据所示