2016-03-20 7 views
2

Für partitionierte Avro Hive-Tabellen werden Feldnamen, die im Avro-Schema Großbuchstaben enthalten, als null zurück gezogen. Ich habe mich gefragt, ob es ein Setting/Workaround gibt, das mir fehlt, oder ob das nur ein Fehler mit dem Hive Context ist.Spark Hive Context - Avro-Tabelle mit Partitionen und Großbuchstaben Feldnamen

ich schon versucht habe folgendes DDL Zugabe:

WITH SERDEPROPERTIES ('casesensitive'='FieldName') 

... und Einstellung spark.sql.caseSensitive auf true/false

Spark-Version 1.5.0 Hive-Version 1.1 0,0

können Sie das Problem neu erstellen, indem Sie die folgenden DDL in Hive ausgeführt wird:

-- 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'); 

... & dann versuchen, aus den Tabellen SQL (Funken Shell) mit Funken wählen:

sqlContext.sql("select * from default.avro_partitions").show 
+-----+----+ 
|field|part| 
+-----+----+ 
| null| 01| 
+-----+----+ 

sqlContext.sql("select * from default.avro_no_partitions").show 
+-----+ 
|field| 
+-----+ 
| test| 
+-----+ 

Antwort

0

Dies kann durch den Namen & in der Schemadefinition aufgelöst werden das Hinzufügen eines Alias ​​für den Groß Namen Kleinbuchstaben :

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", "aliases":["Field"], "type":"string"} ] }'); 
INSERT INTO avro_partitions PARTITION (part='01') VALUES('test'); 

Spark-Version 1.6.0