我需要从Spark SQL创建一个配置单元表,该表将采用PARQUET格式和SNAPPY压缩。以下代码以PARQUET格式创建表,但使用GZIP压缩:
hiveContext.sql("create table NEW_TABLE stored as parquet tblproperties ('parquet.compression'='SNAPPY') as select * from OLD_TABLE")
但在色调"Metastore Tables"->TABLE->"Properties"中,它仍然显示:
| 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")
色调"Metastore Tables"->TABLE->"Properties"显示:
| Parameter | Value |
| ================================ |
| parquet.compression | ABCDE |
这让我觉得TBLPROPERTIES只是被Spark SQL忽略了。
注意:我尝试直接从配置单元运行相同的查询,如果属性等于SNAPPY,则通过适当的压缩(即SNAPPY而非GZIP)成功创建表。
create table NEW_TABLE stored as parquet tblproperties ('parquet.compression'='ABCDE') as select * from OLD_TABLE
如果属性为ABCDE,则查询不会失败,但未创建表。
问题是问题出在哪里?
这是对我有用的组合(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")
HDFS:验证
/user/hive/warehouse/test_table/date=2017-05-14/part-00000-uid.gz.parquet
直接来自Spark文档
当从Hive元存储Parquet表读取和写入时,SparkSQL将尝试使用其自己的Parquet支持,而不是Hive SerDe更好的性能。
然后在下面,您将找到一些属性,这些属性控制Spark是否强制执行所有配置单元选项(和性能…),即spark.sql.hive.convertMetastoreParquet
,以及如何处理Parquet文件上的原始读/写,如spark.sql.parquet.compression.codec
(默认情况下为gzip,您不应感到惊讶)或spark.sql.parquet.int96AsTimestamp
。
无论如何,"默认压缩"属性只是指示性的。在同一个表和目录中,每个Parquet文件都可能有自己的压缩设置——以及页面大小、HDFS块大小等。