pyspark操作hive分区表以及.gz.parquet和part-00000文件压缩问题
文章目录
- pyspark 操作hive表
- 1> `saveAsTable`写入
- 2> `insertInto`写入
- 2.1> 问题说明
- 2.2> 解决办法
- 3>`saveAsTextFile`写入直接操作文件
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…结尾。文件较大
更新时间:2021年10月19日 17点49分 ps: 生产环境spark 版本升级,作业迁移出现问题
spark 2.1 报错
报错信息如下:Exception in thread "main" org.apache.spark.sql.AnalysisException: insertInto() can't be used together with partitionBy(). Partition columns have already be defined for the table. It is not necessary to use partitionBy().;
解决办法
# 去掉partitionBy() 方法,会自动判断分区字段 df.repartition(1).write.insertInto("表名")
数据文件在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文件压缩问题相关推荐
- Spark操作Hive分区表
前言 Spark操作Hive表可谓是异常的方便和简单,这里根据官网简单的总结一下Spark操作Hive分区表 完美的处理处理方式 // 开启Hive动态分区 spark.sqlContext.setC ...
- bz2解压命令_Linux文件操作之文件压缩与解压缩命令详解
文件的压缩和解压缩是非常常见的操作,在 Windows 下我们有很多压缩和解压缩的工具,比如 zip.360 压缩等等.在 Ubuntu 下也有压缩工具,本节我们学习Ubuntu 下图形化以及命令行这 ...
- python应用中调用spark_在python中使用pyspark读写Hive数据操作
1.读Hive表数据 pyspark读取hive数据非常简单,因为它有专门的接口来读取,完全不需要像hbase那样,需要做很多配置,pyspark提供的操作hive的接口,使得程序可以直接使用SQL语 ...
- python读取oracle数据到hvie parquet_关于sparksql操作hive,读取本地csv文件并以parquet的形式装入hive中...
说明:spark版本:2.2.0 hive版本:1.2.1 需求: 有本地csv格式的一个文件,格式为${当天日期}visit.txt,例如20180707visit.txt,现在需要将其通过spar ...
- Spark操作外部数据源(RDBMS,Hive,HBase,Parquet)
文章目录 一.Spark SQL 二.Spark on Hive 三.Hive on Spark 四.Spark读取Parquet文件 五.Spark连接HBase 1.Maven工程添加依赖 2.代 ...
- python操作hive和hive_sql语句
Hive是一个数据仓库基础的应用工具,在Hadoop中用来处理结构化数据,通过类SQL语言对数据进行操作.Hive将sql语句通过解析器转换成MapReduce作业提交到Hadoop集群上,Hadoo ...
- Hive的安装和使用以及Java操作hive
Hive 引言 简介 hive是facebook开源,并捐献给了apache组织,作为apache组织的顶级项目(hive.apache.org). hive是一个基于大数据技术的数据仓库(DataW ...
- Spark SQL操作Hive表
Spark SQL支持从Hive存储中读写数据.然而,Hive存在很多的依赖,而这些依赖又不包含在默认的各类Spark发型版本中.如果将Hive的依赖放入classpath中,Spark将自动加载它们 ...
- spark写表指定外部表_spark 将dataframe数据写入Hive分区表
从spark1.2 到spark1.3,spark SQL中的SchemaRDD变为了DataFrame,DataFrame相对于SchemaRDD有了较大改变,同时提供了更多好用且方便的API. D ...
最新文章
- 解决 python用 xlsxwrite 向excel 中写入中文字符串变量 报错
- Skywalking 结束孵化,成为 Apache 基金会顶级项目
- 快速构建Windows 8风格应用34-构建Toast通知
- Azure China (4) 管理Azure China Storage Account
- 深入理解Nginx:模块开发与架构解析阅读--Nginx架构设计简介
- 图片压缩大小的3种方法,简单快捷实用!
- pycharm常用快捷键总结
- 怎么放大图片不模糊?
- 需求与商业模式创新-需求3-需求工程过程
- python 费马检测
- 【迁移学习】特征空间相同、概率分布不同的概念
- java 虚拟机(2)
- h5在ios下拉上拉会带动整个页面出现空白解决方案
- SQL 注入之二次注入
- java将汉字转化为拼音
- Linux之SUSE系统SAP-HANA经常系统内存不足使得SAP应用不能使用解决方案
- NXP恩智浦集成开发环境IDE S32DS下载教程(最全)
- Eclipse Che安装使用
- 7种Dos攻击和防范方法
- 全能google地图下载器—原理
热门文章
- 2022-2027(新版)中国硅胶鼻导管行业需求规模与竞争前景预测报告
- 2011级-csdn-java-张侃—JSP标准标签库
- VM虚拟机安装10.9苹果操作系统ios7环境配置教程——送你一台苹果电脑
- 【附源码】计算机毕业设计java政府公用车辆管理系统设计与实现
- java启动提示错误怎么解决方法,java 程序 生成可执行文件exe ,运行出现java exception 错误提示框,解决方法思路...
- 今日头条街拍爬虫(2019.7.30更)
- 国产化替代路径(财务软件篇)
- android电视分辨率是多少合适,液晶电视怎么调分辨率 分辨率多少合适
- 路径之谜 java_路径之谜游戏下载
- MyBatis框架 注解的形式开发