写入外部Hive表时的Spark压缩

Rap*_*oth 6 hive apache-spark parquet

我正在插入Spark 2.1的外部蜂巢镶木桌(使用df.write.insertInto(...).通过设置例如

spark.sql("SET spark.sql.parquet.compression.codec=GZIP")
Run Code Online (Sandbox Code Playgroud)

我可以在SNAPPY,GZIP和未压缩之间切换.我可以验证文件大小(和文件名结尾)是否受这些设置的影响.我得到一个名为eg的文件

部分00000-5efbfc08-66fe-4fd1-bebb-944b34689e70.gz.parquet

但是,如果我使用分区的Hive表,此设置没有任何效果,文件大小始终相同.此外,文件名始终是

部分00000

现在,如何在分区的情况下更改(或至少验证)镶木地板文件的压缩编解码器?

我的表是:

CREATE EXTERNAL TABLE `test`(`const` string, `x` int)
PARTITIONED BY (`year` int)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = '1'
)
STORED AS
INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
Run Code Online (Sandbox Code Playgroud)

小智 0

当您创建外部表时,我将按如下方式进行:

首先使用所需的压缩写入镶木地板数据集:

df.write
 .partitionBy("year")
 .option("compression","<gzip|snappy|none>")
 .parquet("<parquet_file_path>")
Run Code Online (Sandbox Code Playgroud)

您可以像以前一样检查文件扩展名。然后,您可以按如下方式创建外部表:

CREATE EXTERNAL TABLE `test`(`const` string, `x` int)
PARTITIONED BY (`year` int)
STORED AS PARQUET
LOCATION '<parquet_file_path>';
Run Code Online (Sandbox Code Playgroud)

如果 Hive 中已经存在外部表,则只需运行以下命令即可刷新表:

MSCK REPAIR TABLE test;
Run Code Online (Sandbox Code Playgroud)