2
パーティション化されたAvro Hiveテーブルの場合、Avroスキーマの大文字を持つフィールド名はnullとして取り戻されます。私はいくつかの設定/回避策があるかどうか、またはこれがHive Contextのバグに過ぎないかどうか疑問に思っていました。Spark Hive Context - パーティションと大文字のフィールド名を持つAvroテーブル
私はすでにDDLに次の追加しようとしました:
WITH SERDEPROPERTIES ('casesensitive'='FieldName')
を...そして真/偽
スパークバージョン1.5.0 ハイブバージョン1.1にspark.sql.caseSensitiveを設定します0.0
あなたはハイブで次のDDLを実行して、問題を再作成することができます
-- Hive DDL using partitions
CREATE TABLE avro_partitions (Field string)
PARTITIONED BY (part string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
TBLPROPERTIES ('avro.schema.literal'=
'{ "type":"record", "name":"avro_partitions", "namespace":"default", "fields":[ {"name":"Field", "type":"string"} ] }');
INSERT INTO avro_partitions PARTITION (part='01') VALUES('test');
-- Hive DDL without partitions
CREATE TABLE avro_no_partitions (Field string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
TBLPROPERTIES ('avro.schema.literal'=
'{ "type":"record", "name":"avro_no_partitions", "namespace":"default", "fields":[ {"name":"Field", "type":"string"} ] }');
INSERT INTO avro_no_partitions VALUES('test');
... &は、スパークSQL(スパーク・シェル)を使用して表から選択しようとしている:これは大文字の名前のエイリアスを追加&を小文字の名前を作ることによって、スキーマ定義に解決することができます
sqlContext.sql("select * from default.avro_partitions").show
+-----+----+
|field|part|
+-----+----+
| null| 01|
+-----+----+
sqlContext.sql("select * from default.avro_no_partitions").show
+-----+
|field|
+-----+
| test|
+-----+