我需要从Spark SQL创建一个Hive表,它将采用PARQUET格式和SNAPPY压缩。 以下代码以PARQUET格式创建表,但使用GZIP压缩:
hiveContext.sql("create table NEW_TABLE stored as parquet tblproperties ('parquet.compression'='SNAPPY') as select * from OLD_TABLE")
但在Hue“Metastore Tables”中 - >表 - >它仍然显示“属性”:
| Parameter | Value |
| ================================ |
| parquet.compression | SNAPPY |
如果我将SNAPPY更改为任何其他字符串,例如 ABCDE 代码仍然正常,但压缩仍为GZIP:
hiveContext.sql("create table NEW_TABLE stored as parquet tblproperties ('parquet.compression'='ABCDE') as select * from OLD_TABLE")
和Hue“Metastore Tables” - >表 - > “属性”显示:
| Parameter | Value |
| ================================ |
| parquet.compression | ABCDE |
这让我觉得Spark SQL会忽略TBLPROPERTIES。
注意:我试图直接从Hive运行相同的查询,如果属性等于SNAPPY表,则通过适当的压缩成功创建(即SNAPPY而不是GZIP)。
create table NEW_TABLE stored as parquet tblproperties ('parquet.compression'='ABCDE') as select * from OLD_TABLE
如果属性为 ABCDE ,则查询未失败,但尚未创建表。
问题是什么问题?
答案 0 :(得分:4)
这是适用于我的组合(Spark 2.1.0):
SELECT *
FROM Image
JOIN image_like ON Image.id = image_like.id
WHERE Image.username = image_like.username
在HDFS中验证:
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")
答案 1 :(得分:2)
在阅读和写作Hive Metastore Parquet表时,Spark SQL将尝试使用其自己的 Parquet支持而不是Hive SerDe 更好的表现。
然后在下面,您将找到一些属性来控制Spark是否强制执行所有Hive选项(和性能......),即spark.sql.hive.convertMetastoreParquet
,以及如何处理Parquet文件上的原始读/写,例如{{1 } (默认为gzip - 你不应该感到惊讶)或spark.sql.parquet.compression.codec
。
无论如何,“默认压缩”属性只是指示性的。在同一个表和目录中,每个Parquet文件可能有自己的压缩设置 - 页面大小,HDFS块大小等。