2016-01-20 4 views
8

2つのParquetファイルを含むフォルダに文字列、文字列、doubleのハイブテーブルを作成しようとしています。最初の一節ファイルのスキーマは文字列、文字列、doubleであり、2番目のファイルのスキーマは文字列、double、文字列です。豚にハイパーテーブルを使用する

CREATE EXTERNAL TABLE dynschema (
trans_date string, 
currency string, 
rate double) 
STORED AS PARQUET 
LOCATION '/user/impadmin/test/parquet/evolution/'; 

私はブタ(0.14)スクリプトでハイブテーブルを使用しようとしています。

A = LOAD 'dynschema' USING org.apache.hive.hcatalog.pig.HCatLoader(); 

DUMP A; 

しかし、私はエラー

java.lang.UnsupportedOperationExceptionが出る:私が原因である疑いがあるorg.apache.hadoop.hive.serde2.io.DoubleWritable

を検査することはできません最初のファイルの分割が正常に読み取られたが、この例外は2番目のファイルの分割を読み取っているときに発生するため、2番目のファイルのスキーマへのアクセスはテーブルスキーマとは異なります。

IもHCatRecordReader'sコードに見て、コード

ここ
DefaultHCatRecord dr = new DefaultHCatRecord(outputSchema.size()); 
    int i = 0; 
    for (String fieldName : outputSchema.getFieldNames()) { 
    if (dataSchema.getPosition(fieldName) != null) { 
     dr.set(i, r.get(fieldName, dataSchema)); 
    } else { 
     dr.set(i, valuesNotInDataCols.get(fieldName)); 
    } 
    i++; 
    } 

のこの部分を発見し、私は変換のロジックは、データスキーマから出力スキーマに存在することがわかるが、デバッグしながら、私が見つかりました。両方のスキーマに違いはありません。

私は、場合は、別のスキーマを持つ複数の寄木細工のファイル上で作成したハイブのテーブルからデータを読み出す

  1. 豚のサポートこのようなケースを見つけるために助けてください。

  2. もしそうなら、これを行う方法。

+0

スキーマが分かっている場合は、豚寄木細工ローダーを使用してスキーマの進化を引き起こすはずのスキーマを手動で指定します。スキーマの進化が難しいように見えますが、この特定のケースで役立つかどうかはわかりません。 – LiMuBei

+0

Avroの場合もそうでしょうか? – SaurabhG

+0

豚avroストレージの仕組みがわからない。私は手動でスキーマを指定することもできると思います。 – LiMuBei

答えて

1

あなたは2つの異なるスキーマを持つファイルがある場合は、次のように賢明のようです:彼らは

  • は、それらのうちの
  • をテーブルを作成していたスキーマに基づいてファイルを分割

    1. 望ましい場合は、個々のテーブルをロードしてスーパーテーブルに格納してください。
    関連する問題