写入外部配置单元表时触发压缩

iyfamqjs  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(298)

我插入到一个外部HiveParquet表从Spark2.1(使用 df.write.insertInto(...) . 通过设置例如。

spark.sql("SET spark.sql.parquet.compression.codec=GZIP")

我可以在snappy、gzip和uncompressed之间切换。我可以验证文件大小(和文件名结尾)是否受这些设置的影响。我得到一个名为e.g。
part-00000-5efbfc08-66fe-4fd1-bebb-944b34689e70.gz.Parquet地板
但是,如果使用分区配置单元表,此设置没有任何影响,文件大小始终相同。另外,文件名总是
第00000部分
现在,如何更改(或至少验证)分区情况下Parquet文件的压缩编解码器?
我的table是:

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'
c86crjj0

c86crjj01#

在创建外部表时,我将按以下方式进行操作:
首先编写具有所需压缩的Parquet数据集:

df.write
 .partitionBy("year")
 .option("compression","<gzip|snappy|none>")
 .parquet("<parquet_file_path>")

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

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

如果配置单元中已存在外部表,则只需运行以刷新表:

MSCK REPAIR TABLE test;

相关问题