apache-spark - 写入外部 Hive 表时进行 Spark 压缩

标签 apache-spark hive parquet

我正在从 Spark 2.1 插入外部 hive-parquet 表(使用 df.write.insertInto(...) 。通过设置例如

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

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

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



然而如果我使用分区的 Hive 表 ,这个设置没有任何作用,文件大小总是一样的。此外,文件名总是

part-00000



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

我的表是:
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'

最佳答案

当您创建外部表时,我会像这样进行:

首先使用所需的压缩编写您的 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>';

如果外部表已存在于 Hive 中,则只需运行以刷新表:
MSCK REPAIR TABLE test;

关于apache-spark - 写入外部 Hive 表时进行 Spark 压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54023847/

相关文章:

apache-spark - 在 yarn 集群模式下运行 Spark 应用程序时找不到HADOOP_HOME

scala - 如何在scala中漂亮地打印Option返回的值?

hadoop - 在HIVE表中加载日志文件

performance - 将数据帧写入 Parquet 时,Spark Executor 性能低下

java - 如何处理 Apache Spark 中 foreach block 之前运行的代码?

hive - Airflow HiveCliHook 连接到远程配置单元集群?

json - 将 JSON 数据从一个表插入到 HIVE 中的另一个表

apache-spark - spark 2.3.0, parquet 1.8.2 - spark write 生成的文件中不存在二进制字段的统计信息?

apache-spark - 如何将表从 redshift 导出为 Parquet 格式?

arrays - spark udaf 更新数组类型的元组