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上显示:
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://表全路径')
文件操作更多方式见官方文档
来源:https://www.cnblogs.com/Sherry-g/p/15184002.html


猜你喜欢
- 如下所示:import sysfrom PyQt5 import QtGui, QtCore, QtWidgetsfrom PyQt5.Qt
- 今天有个需要需要传递中文参数给URL但是在GBK环境下的脚本传递GBK的参数老是给我报UNICODE的解码错误。烦的很。所以我们果断选择用u
- 在 python 代码中可以看到一些常见的 trick,在这里做一个简单的小结。json 字符串格式化在开发 web 应用的时候经常会用到
- 简介单例模式是创建型对象的一种,用于如何优雅的创建对象。让一个类最多产生一个对象。场景只需要一个对象就能解决并且要使用多次的场景,比如框架的
- Python算术运算符以下假设变量a为10,变量b为20:运算符描述实例+加 - 两个对象相加a + b 输出结果 30-减 - 得到负数或
- Javascript作为一门脚本语言,在设计之初并没有考虑到面向对象的特性。即便到了当今这个遍布现代浏览器的年代,各种Javascript
- 一、概述切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。切片是一个引用类型
- #coding=utf-8#对话框import sysfrom PyQt4 import QtGui, QtCoreclass Window
- 本文介绍了可以帮助简化 PHP 开发的10个项目,包括框架,类库,工具,代码。1.CakePHP Development Framework
- Cookie简介首先,我们对Cookie做一个简单的介绍,说明如何利用ASP来维护cookie。Cookie是存储在客户端计算机中的一个小文
- 本文实例讲述了Go语言实现定时器的方法。分享给大家供大家参考。具体实现方法如下:package mainimport ( &quo
- 前言order by满足两种情况,会使用 index 方式排序:order by语句使用索引最左前列(最左匹配法则)where子句和orde
- 什么是网络?网络是由节点和连线构成,表示诸多对象及其相互联系。在数学上,网络是一种图,一般认为专指加权图。网络除了数学定义外,还有具体的物理
- 前言今天小编就带着大家来盘点一下数据抓取过程中这些主流的加密算法,它们有什么特征、加密的方式有哪些等等,知道了这些之后对于我们逆向破解这些加
- 该方法支持IE浏览器和其他浏览器。1、首先定义两个link,当然你也可以是一个,第二个是要更改的css<link rel="
- 多属性排序:把需要排序的属性拿出来作为一个 tuple,主要的放前面,次要的放后面。假如某对象有n个属性,那么先按某规则对属性a进行排序,在
- “用户体验(User Experience,简称UX 或 UE)是一种纯主观的在用户使用一个产品(服务)的过程中建立起来的心理感受。因为它是
- 几天前,浏览器家族有刚诞生了一位小王子,就是Google推出的Chrome浏览器。由于Chrome出生名门,尽管他还是个小家伙,没有人敢小看
- 通用形态学函数上篇博文,我们介绍了形态学的基础腐蚀与膨胀操作,而将腐蚀与膨胀结合起来进行组合,我们就能实现开运算,闭运算等复杂的形态学运算。
- 1.配置需要python3.7,Chrome或者Edeg浏览器,Chrome驱动或者Edge驱动#需要配置selenium库,baidu-a