pyspark操作hive分区表及.gz.parquet和part-00000文件压缩问题

作者:土豆啊你个马铃薯 时间:2022-02-07 14:35:53 

pyspark 操作hive表

pyspark 操作hive表,hive分区表动态写入;最近发现spark动态写入hive分区,和saveAsTable存表方式相比,文件压缩比大约 4:1。针对该问题整理了 spark 操作hive表的几种方式。

1> saveAsTable写入

saveAsTable(self, name, format=None, mode=None, partitionBy=None, **options)

示例:


df.write.saveAsTable("表名",mode='overwrite')

注意:

1、表不存在则创建表,表存在全覆盖写入;
2、表存在,数据字段有变化,先删除后重新创建表;
3、当正在存表时报错或者终止程序会导致表丢失;
4、数据默认采用parquet压缩,文件名称 part-00000-5efbfc08-66fe-4fd1-bebb-944b34689e70.gz.parquet

数据文件在hdfs上显示:

pyspark操作hive分区表及.gz.parquet和part-00000文件压缩问题

2> insertInto写入

insertInto(self, tableName, overwrite=False):
示例:


# append 写入
df.repartition(1).write.partitionBy('dt').insertInto("表名")
# overwrite 写入
df.repartition(1).write.partitionBy('dt').insertInto("表名",overwrite=True)
# 动态分区使用该方法

注意:

1、df.write.mode("overwrite").partitionBy("dt").insertInto("表名") 不会覆盖数据
2、需要表必须存在且当前DF的schema与目标表的schema必须一致
3、插入的文件不会压缩;文件以part-00....结尾。文件较大

数据文件在hdfs上显示:

pyspark操作hive分区表及.gz.parquet和part-00000文件压缩问题

2.1> 问题说明

两种方式存储数据量一样的数据,磁盘文件占比却相差很大,.gz.parquet 文件 相比 part-00000文件要小很多。想用spark操作分区表,又想让文件压缩,百度了一些方式,都没有解决。
从stackoverflow中有一个类似的问题 Spark compression when writing to external Hive table 。用里面的方法并没有解决。
最终从hive表数据文件压缩角度思考,问题得到解决。

hive 建表指定压缩格式
下面是hive parquet的几种压缩方式


-- 使用snappy
CREATE TABLE if not exists ods.table_test(
   id string,
   open_time string
)
COMMENT '测试'
PARTITIONED BY (`dt` string COMMENT '按天分区')
row format delimited fields terminated by '\001'
STORED AS PARQUET
TBLPROPERTIES ('parquet.compression'='SNAPPY');

-- 使用gzip
CREATE TABLE if not exists ods.table_test(
   id string,
   open_time string
)
COMMENT '测试'
PARTITIONED BY (`dt` string COMMENT '按天分区')
row format delimited fields terminated by '\001'
STORED AS PARQUET
TBLPROPERTIES ('parquet.compression'='GZIP');

-- 使用uncompressed
CREATE TABLE if not exists ods.table_test(
   id string,
   open_time string
)
COMMENT '测试'
PARTITIONED BY (`dt` string COMMENT '按天分区')
row format delimited fields terminated by '\001'
STORED AS PARQUET
TBLPROPERTIES ('parquet.compression'='UNCOMPRESSED');

-- 使用默认
CREATE TABLE if not exists ods.table_test(
   id string,
   open_time string
)
COMMENT '测试'
PARTITIONED BY (`dt` string COMMENT '按天分区')
row format delimited fields terminated by '\001'
STORED AS PARQUET;

-- 设置参数 set parquet.compression=SNAPPY;

2.2> 解决办法

建表时指定TBLPROPERTIES,采用gzip 压缩
示例:


drop table if exists ods.table_test
CREATE TABLE if not exists ods.table_test(
id string,
open_time string
)
COMMENT '测试'
PARTITIONED BY (`dt` string COMMENT '按天分区')
row format delimited fields terminated by '\001'
STORED AS PARQUET
TBLPROPERTIES ('parquet.compression'='GZIP');

执行效果

数据文件在hdfs上显示:

pyspark操作hive分区表及.gz.parquet和part-00000文件压缩问题

可以看到文件大小占比已经和 *.gz.parquet 文件格式一样了

3>saveAsTextFile写入直接操作文件

saveAsTextFile(self, path, compressionCodecClass=None)
该方式通过rdd 以文件形式直接将数据存储在hdfs上。
示例:


rdd.saveAsTextFile('hdfs://表全路径')

文件操作更多方式见官方文档

来源:https://www.cnblogs.com/Sherry-g/p/15184002.html

标签:pyspark,hive,分区表,parquet
0
投稿

猜你喜欢

  • 如何导出python安装的所有模块名称和版本号到文件中

    2022-07-26 15:38:59
  • Python利用pythonping处理ping的示例详解

    2023-08-12 00:28:45
  • python梯度下降算法的实现

    2022-01-25 11:11:09
  • Dreamweaver快捷键大全

    2007-11-05 14:08:00
  • Python字符串中查找子串小技巧

    2022-04-16 10:58:04
  • sql not in 与not exists使用中的细微差别

    2024-01-26 09:40:43
  • 图像检索之基于vlfeat实现SIFT特征

    2021-11-18 13:13:40
  • 深入探讨SQL Server 2008商务智能(BI)

    2008-12-23 13:56:00
  • python实现两个dict合并与计算操作示例

    2021-07-29 15:37:25
  • Java使用JDBC向MySQL数据库批次插入10W条数据(测试效率)

    2024-01-15 15:41:11
  • Centos 6.5下安装MySQL 5.6教程

    2024-01-16 16:57:04
  • 用ADODB.Stream代替FSO读取/写入文本文件

    2008-01-31 12:19:00
  • tensorflow 中对数组元素的操作方法

    2022-01-22 11:35:37
  • element-UI el-table树形数据 修改小三角图标方式

    2023-07-02 17:09:53
  • vue实现导航栏下拉菜单

    2024-05-09 15:17:56
  • Python之OptionParser模块使用详解

    2021-03-08 14:07:48
  • 读写xml文件的2个小函数

    2007-08-23 12:59:00
  • Python3.4学习笔记之常用操作符,条件分支和循环用法示例

    2021-08-24 03:06:43
  • Python Numpy 数组的初始化和基本操作

    2022-08-28 22:18:23
  • 网页开发中的容易忽略的问题 javascript HTML中的table

    2023-09-04 20:43:52
  • asp之家 网络编程 m.aspxhome.com