2016-04-29 8 views
2

Ich muss eine Hive-Tabelle aus Spark SQL erstellen, die im PARQUET-Format und in der SNAPPY-Komprimierung vorliegt. Der folgende Code erstellt Tabelle in PARKETT-Format, aber mit GZIP-Komprimierung:Spark SQL ignoriert die in TBLPROPERTIES angegebene parquet.compression-Eigenschaft

hiveContext.sql("create table NEW_TABLE stored as parquet tblproperties ('parquet.compression'='SNAPPY') as select * from OLD_TABLE") 

Aber in dem Farbton "Metastore Tables" -> TABLE -> "Eigenschaften" es zeigt immer noch:

| Parameter   | Value | 
| ================================ | 
| parquet.compression | SNAPPY | 

Wenn Ich ändere SNAPPY zu irgendeiner anderen Schnur zB ABCDE der Code funktioniert immer noch gut mit Ausnahme, dass die Kompression noch GZIP ist:

hiveContext.sql("create table NEW_TABLE stored as parquet tblproperties ('parquet.compression'='ABCDE') as select * from OLD_TABLE") 

und Farbton "Metastore Tables" -> TABLE -> "Eigenschaften" zeigt:

| Parameter   | Value | 
| ================================ | 
| parquet.compression | ABCDE | 

Diese mich denken dass TBLPROPERTIES nur von Spark SQL ignoriert werden.

Hinweis: Ich habe versucht, die gleiche Abfrage direkt von Hive und im Falle, wenn die Eigenschaft gleich SNAPPY Tabelle wurde erfolgreich erstellt mit der richtigen Komprimierung (d. H. SNAPPY nicht GZIP).

create table NEW_TABLE stored as parquet tblproperties ('parquet.compression'='ABCDE') as select * from OLD_TABLE 

Im Fall, wenn die Eigenschaft ABCDE die Abfrage nicht versagt hat, aber Tabelle noch nicht erstellt wurde.

Frage ist was ist das Problem?

Antwort

2

Gerade von Spark documentation

beim Lesen und Schreiben Metastore Parkett Tabellen Hive Spark SQL wird versuchen, seine eigene Parkett Unterstützung zu verwenden statt Hive SerDe für eine bessere Leistung.

Dann einfach unten finden Sie einige Eigenschaften finden, die steuern, ob alle Spark-Hive Optionen erzwingen (und Leistung ...), dh spark.sql.hive.convertMetastoreParquet und wie roh Lese zu handhaben/schreibt auf Parkett Dateien wie spark.sql.parquet.compression.codec(gzip standardmäßig - Sie sollten nicht überrascht sein) oder spark.sql.parquet.int96AsTimestamp.

Wie auch immer, die "Standardkomprimierung" Eigenschaften sind nur hinweisend. Innerhalb der gleichen Tabelle und Verzeichnis kann jedes Parkett Datei eine eigenen Komprimierungseinstellungen hat - und die Seitengröße, HDFS Blockgröße usw.

+0

Ah, und Funken eindeutig nicht die Werte von "TblProperties" gepusht zum Metastore überprüft - aber die Metastore * nicht * überprüfen. Es sieht so aus, als gäbe es eine Ausnahme, die nicht korrekt abgefangen wird. Daher erstellt der Metastore nicht die Tabellendefinition ... aber Spark erstellt die Dateien im erwarteten Verzeichnis trotzdem. –

2

Dies ist die Combo, die für mich gearbeitet (Spark-2.1.0):

spark.sql("SET spark.sql.parquet.compression.codec=GZIP") 
spark.sql("CREATE TABLE test_table USING PARQUET PARTITIONED BY (date) AS SELECT * FROM test_temp_table") 

in HDFS Bestätigte:

/user/hive/warehouse/test_table/date=2017-05-14/part-00000-uid.gz.parquet