ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-08-25 11:02:24  阅读:291  来源: 互联网

标签:COMMENT string pyspark 写入 gz hive 分区表 parquet dt


@

目录

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://表全路径')
    
    文件操作更多方式见官方文档

标签:COMMENT,string,pyspark,写入,gz,hive,分区表,parquet,dt
来源: https://www.cnblogs.com/Sherry-g/p/15184002.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有