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



我需要从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块大小等。

相关内容

  • 没有找到相关文章

最新更新