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

 更新时间:2021年08月25日 11:17:40   作者:土豆啊你个马铃薯  
这篇文章主要介绍了pyspark操作hive分区表及.gz.parquet和part-00000文件压缩问题,针对问题整理了spark操作hive表的几种方式,需要的朋友可以参考下

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上显示:

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上显示:

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上显示:

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

3>saveAsTextFile写入直接操作文件

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

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

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

到此这篇关于pyspark操作hive分区表及.gz.parquet和part-00000文件压缩问题的文章就介绍到这了,更多相关pyspark hive分区表parquet内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python 实现微信自动回复的方法

    Python 实现微信自动回复的方法

    这篇文章主要介绍了Python 实现微信自动回复的方法,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-09-09
  • 一道题学会Python函数中形参和实参

    一道题学会Python函数中形参和实参

    在Python编程中,函数的形参和实参是函数定义和调用的重要概念,本文主要介绍了一道题学会Python函数中形参和实参,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 将.py文件转化为.exe文件的详细过程

    将.py文件转化为.exe文件的详细过程

    学Python那么久了,才知道自己不会把脚本编译成可执行exe文件,下面这篇文章主要给大家介绍了关于将.py文件转化为.exe文件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • 使用python PIL库批量对图片添加水印的过程详解

    使用python PIL库批量对图片添加水印的过程详解

    平常我们想给某些图片添加文字水印,方法有很多,也有很多的工具可以方便的进行,今天主要是对PIL库的应用,结合Python语言批量对图片添加水印,文章通过代码示例给大家介绍的非常详细,感兴趣的同学可以参考一下
    2023-11-11
  • python算法学习之桶排序算法实例(分块排序)

    python算法学习之桶排序算法实例(分块排序)

    本代码介绍了python算法学习中的桶排序算法实例,大家参考使用吧
    2013-12-12
  • numba提升python运行速度的实例方法

    numba提升python运行速度的实例方法

    在本篇文章里小编给大家整理的是一篇关于numba提升python运行速度的实例方法,有兴趣的朋友们可以参考下。
    2021-01-01
  • python 把列表转化为字符串的方法

    python 把列表转化为字符串的方法

    今天小编就为大家分享一篇python 把列表转化为字符串的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Python 中random 库的详细使用

    Python 中random 库的详细使用

    random库是使用随机数的Python标准库,python中用于生成伪随机数的函数库是random,今天通过本文给大家分享Python 中random 库的详细使用,感兴趣的朋友一起看看吧
    2021-06-06
  • python实现决策树ID3算法的示例代码

    python实现决策树ID3算法的示例代码

    这篇文章主要介绍了python实现决策树ID3算法的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Flask 入门Web 微框架Hello Flask

    Flask 入门Web 微框架Hello Flask

    这篇文章主要介绍了 Flask 入门Web 微框架Hello Flask,Flask 是一个 Python 实现的 Web 微框架,之所以称之为微框架,是因为 Flask 核心简单且易于扩展,有两个主要依赖,WSGI工具集:Werkzeug和模板引擎:Jinja2,Flask 只保留了 Web 开发的核心功能,需要的朋友可以参考一下
    2021-11-11

最新评论