4

パーティションを持つ外部 HIVE テーブルを作成しようとしています。一部の列名には大文字が含まれています。これにより、大文字の列名の値が NULL として返されるため、テーブルの作成中に問題が発生しました。次に、SERDEPROPERTIES を使用してこれを処理するために ParquetSerDe を変更しましたが、これは外部テーブル (パーティション分割されていません) で動作していました。今、外部テーブル WITH パーティションを作成しようとしていますが、大文字の列 (例: FieldName) にアクセスしようとすると、このエラーが発生します。tablename から FieldName を選択します。

    FAILED: RuntimeException Java. Lang.RuntimeException: cannot find field
    FieldName from
    [org.apache.hadoop.hive.serde2.objectinspector.UnionStructObjectInspector$MyField@4f45884b,
    org.apache.hadoop.hive.serde2.objectinspector.UnionStructObjectInspector$MyField@8f11f27,
    org.apache.hadoop.hive.serde2.objectinspector.UnionStructObjectInspector$MyField@77e8eb0e,
    org.apache.hadoop.hive.serde2.objectinspector.UnionStructObjectInspector$MyField@1dae4cd,
   org.apache.hadoop.hive.serde2.objectinspector.UnionStructObjectInspector$MyField@623e336d
   ]

考えられる提案はありますか?データ ソースのスキーマを変更できません。

これは、テーブルを作成するために使用するコマンドです-

    CREATE EXTERNAL TABLE tablename (fieldname string)
    PARTITIONED BY (partion_name string)
    ROW FORMAT SERDE 'path.ModifiedParquetSerDeLatest'
    WITH SERDEPROPERTIES ("casesensitive"="FieldName")
    STORED AS INPUTFORMAT 'parquet.hive.DeprecatedParquetInputFormat'
    OUTPUTFORMAT 'parquet.hive.DeprecatedParquetOutputFormat'

次に、パーティションを追加します。

    ALTER TABLE tablename ADD PARTITION (partition_name='partitionvalue')
    LOCATION '/path/to/data'
4

1 に答える 1

2

これは古い質問ですが、格納先の UNIX ファイルシステムのため、パーティション列は大文字と小文字を区別する必要があります。

パス "/columnname=value/" は、UNIX のパス "/columnName=value/" とは常に異なります

したがって、Hive で大文字と小文字を区別しない列名に依存することは、悪い習慣と見なす必要があります。

于 2017-04-09T11:59:48.793 に答える