-1

現在、本番 Hadoop クラスターのほとんどのデータセットは、AVRO + SNAPPY 形式で保存されています。Parquet について多くの良いことを聞いたので、試してみたいと思います。

この Web ページに従って、ETL の 1 つを変更して、Avro ではなく Parquet ファイルをレデューサーの出力として生成するようにしました。Parquet + Avro スキーマを使用して、最終出力データとスナッピー コーデックを生成しました。すべて正常に動作します。したがって、最終出力の寄木細工のファイルは、元の Avro ファイルと同じスキーマを持つ必要があります。

ここで、これらの Parquet ファイル用の Hive テーブルを作成してみます。現在、私たちが使用している IBM BigInsight 3.0 には、Hive 12 と Parquet 1.3.2 が含まれています。Avro スキーマ ファイルに基づいて、次の Hive 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'

テーブルは 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

エラーは構造体列の最初のネストされた配列から発生していることに気付きました。私の質問は次のとおりです。

  1. Parquet は構造体のネストされた配列をサポートしていますか?
  2. これは Parquet 1.3.2 のみに関連していますか? Parquet 1.3.2 に関する解決策はありますか?
  3. 上記の問題を修正するために新しいバージョンの Parquet を使用する必要がある場合、実行時に Parquet 1.3.2 を使用できる場合、問題は発生しますか?
  4. 寄木細工のデータから、ネスト構造の「展開」など、あらゆる種類の Hive 機能を使用できますか?

私たちが探しているのは、parquet が現在 AVRO を使用しているのと同じように使用できるかどうかを知ることですが、AVRO に欠けている列型ストレージの利点を提供してくれます。

4

1 に答える 1

0

この Jira チケットに示されているように、Hive 12 は parquet ファイルのネスト構造をサポートしていないようです。

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

于 2015-03-03T18:32:55.767 に答える