Spark SQL忽略TBLPROPERTIES中指定的parquet.compression属性

时间:2016-04-29 14:37:07

标签: apache-spark-sql hiveql parquet

我需要从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 ,则查询未失败,但尚未创建表。

问题是什么问题?

2 个答案:

答案 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)

直接来自Spark documentation

  

在阅读和写作Hive Metastore Parquet表时,Spark   SQL将尝试使用其自己的 Parquet支持而不是Hive SerDe   更好的表现。

然后在下面,您将找到一些属性来控制Spark是否强制执行所有Hive选项(和性能......),即spark.sql.hive.convertMetastoreParquet,以及如何处理Parquet文件上的原始读/写,例如{{1 } (默认为gzip - 你不应该感到惊讶)spark.sql.parquet.compression.codec

无论如何,“默认压缩”属性只是指示性的。在同一个表和目录中,每个Parquet文件可能有自己的压缩设置 - 页面大小,HDFS块大小等。