文章目录

  • 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文件压缩问题相关推荐

  1. Spark操作Hive分区表

    前言 Spark操作Hive表可谓是异常的方便和简单,这里根据官网简单的总结一下Spark操作Hive分区表 完美的处理处理方式 // 开启Hive动态分区 spark.sqlContext.setC ...

  2. bz2解压命令_Linux文件操作之文件压缩与解压缩命令详解

    文件的压缩和解压缩是非常常见的操作,在 Windows 下我们有很多压缩和解压缩的工具,比如 zip.360 压缩等等.在 Ubuntu 下也有压缩工具,本节我们学习Ubuntu 下图形化以及命令行这 ...

  3. python应用中调用spark_在python中使用pyspark读写Hive数据操作

    1.读Hive表数据 pyspark读取hive数据非常简单,因为它有专门的接口来读取,完全不需要像hbase那样,需要做很多配置,pyspark提供的操作hive的接口,使得程序可以直接使用SQL语 ...

  4. python读取oracle数据到hvie parquet_关于sparksql操作hive,读取本地csv文件并以parquet的形式装入hive中...

    说明:spark版本:2.2.0 hive版本:1.2.1 需求: 有本地csv格式的一个文件,格式为${当天日期}visit.txt,例如20180707visit.txt,现在需要将其通过spar ...

  5. Spark操作外部数据源(RDBMS,Hive,HBase,Parquet)

    文章目录 一.Spark SQL 二.Spark on Hive 三.Hive on Spark 四.Spark读取Parquet文件 五.Spark连接HBase 1.Maven工程添加依赖 2.代 ...

  6. python操作hive和hive_sql语句

    Hive是一个数据仓库基础的应用工具,在Hadoop中用来处理结构化数据,通过类SQL语言对数据进行操作.Hive将sql语句通过解析器转换成MapReduce作业提交到Hadoop集群上,Hadoo ...

  7. Hive的安装和使用以及Java操作hive

    Hive 引言 简介 hive是facebook开源,并捐献给了apache组织,作为apache组织的顶级项目(hive.apache.org). hive是一个基于大数据技术的数据仓库(DataW ...

  8. Spark SQL操作Hive表

    Spark SQL支持从Hive存储中读写数据.然而,Hive存在很多的依赖,而这些依赖又不包含在默认的各类Spark发型版本中.如果将Hive的依赖放入classpath中,Spark将自动加载它们 ...

  9. spark写表指定外部表_spark 将dataframe数据写入Hive分区表

    从spark1.2 到spark1.3,spark SQL中的SchemaRDD变为了DataFrame,DataFrame相对于SchemaRDD有了较大改变,同时提供了更多好用且方便的API. D ...

最新文章

  1. 解决 python用 xlsxwrite 向excel 中写入中文字符串变量 报错
  2. Skywalking 结束孵化,成为 Apache 基金会顶级项目
  3. 快速构建Windows 8风格应用34-构建Toast通知
  4. Azure China (4) 管理Azure China Storage Account
  5. 深入理解Nginx:模块开发与架构解析阅读--Nginx架构设计简介
  6. 图片压缩大小的3种方法,简单快捷实用!
  7. pycharm常用快捷键总结
  8. 怎么放大图片不模糊?
  9. 需求与商业模式创新-需求3-需求工程过程
  10. python 费马检测
  11. 【迁移学习】特征空间相同、概率分布不同的概念
  12. java 虚拟机(2)
  13. h5在ios下拉上拉会带动整个页面出现空白解决方案
  14. SQL 注入之二次注入
  15. java将汉字转化为拼音
  16. Linux之SUSE系统SAP-HANA经常系统内存不足使得SAP应用不能使用解决方案
  17. NXP恩智浦集成开发环境IDE S32DS下载教程(最全)
  18. Eclipse Che安装使用
  19. 7种Dos攻击和防范方法
  20. 全能google地图下载器—原理

热门文章

  1. 2022-2027(新版)中国硅胶鼻导管行业需求规模与竞争前景预测报告
  2. 2011级-csdn-java-张侃—JSP标准标签库
  3. VM虚拟机安装10.9苹果操作系统ios7环境配置教程——送你一台苹果电脑
  4. 【附源码】计算机毕业设计java政府公用车辆管理系统设计与实现
  5. java启动提示错误怎么解决方法,java 程序 生成可执行文件exe ,运行出现java exception 错误提示框,解决方法思路...
  6. 今日头条街拍爬虫(2019.7.30更)
  7. 国产化替代路径(财务软件篇)
  8. android电视分辨率是多少合适,液晶电视怎么调分辨率 分辨率多少合适
  9. 路径之谜 java_路径之谜游戏下载
  10. MyBatis框架 注解的形式开发