pyspark操作hive分區(qū)表及.gz.parquet和part-00000文件壓縮問(wèn)題
pyspark 操作hive表
pyspark 操作hive表,hive分區(qū)表動(dòng)態(tài)寫(xiě)入;最近發(fā)現(xiàn)spark動(dòng)態(tài)寫(xiě)入hive分區(qū),和saveAsTable存表方式相比,文件壓縮比大約 4:1。針對(duì)該問(wèn)題整理了 spark 操作hive表的幾種方式。
1> saveAsTable寫(xiě)入
saveAsTable(self, name, format=None, mode=None, partitionBy=None, **options)
示例:
df.write.saveAsTable("表名",mode='overwrite')
注意:
1、表不存在則創(chuàng)建表,表存在全覆蓋寫(xiě)入;
2、表存在,數(shù)據(jù)字段有變化,先刪除后重新創(chuàng)建表;
3、當(dāng)正在存表時(shí)報(bào)錯(cuò)或者終止程序會(huì)導(dǎo)致表丟失;
4、數(shù)據(jù)默認(rèn)采用parquet壓縮,文件名稱 part-00000-5efbfc08-66fe-4fd1-bebb-944b34689e70.gz.parquet
數(shù)據(jù)文件在hdfs上顯示:
2> insertInto寫(xiě)入
insertInto(self, tableName, overwrite=False):
示例:
# append 寫(xiě)入 df.repartition(1).write.partitionBy('dt').insertInto("表名") # overwrite 寫(xiě)入 df.repartition(1).write.partitionBy('dt').insertInto("表名",overwrite=True) # 動(dòng)態(tài)分區(qū)使用該方法
注意:
1、df.write.mode("overwrite").partitionBy("dt").insertInto("表名") 不會(huì)覆蓋數(shù)據(jù)
2、需要表必須存在且當(dāng)前DF的schema與目標(biāo)表的schema必須一致
3、插入的文件不會(huì)壓縮;文件以part-00....結(jié)尾。文件較大
數(shù)據(jù)文件在hdfs上顯示:
2.1> 問(wèn)題說(shuō)明
兩種方式存儲(chǔ)數(shù)據(jù)量一樣的數(shù)據(jù),磁盤(pán)文件占比卻相差很大,.gz.parquet 文件 相比 part-00000文件要小很多。想用spark操作分區(qū)表,又想讓文件壓縮,百度了一些方式,都沒(méi)有解決。
從stackoverflow中有一個(gè)類似的問(wèn)題 Spark compression when writing to external Hive table 。用里面的方法并沒(méi)有解決。
最終從hive表數(shù)據(jù)文件壓縮角度思考,問(wèn)題得到解決。
hive 建表指定壓縮格式
下面是hive parquet的幾種壓縮方式
-- 使用snappy CREATE TABLE if not exists ods.table_test( id string, open_time string ) COMMENT '測(cè)試' PARTITIONED BY (`dt` string COMMENT '按天分區(qū)') 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 '測(cè)試' PARTITIONED BY (`dt` string COMMENT '按天分區(qū)') 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 '測(cè)試' PARTITIONED BY (`dt` string COMMENT '按天分區(qū)') row format delimited fields terminated by '\001' STORED AS PARQUET TBLPROPERTIES ('parquet.compression'='UNCOMPRESSED'); -- 使用默認(rèn) CREATE TABLE if not exists ods.table_test( id string, open_time string ) COMMENT '測(cè)試' PARTITIONED BY (`dt` string COMMENT '按天分區(qū)') row format delimited fields terminated by '\001' STORED AS PARQUET; -- 設(shè)置參數(shù) set parquet.compression=SNAPPY;
2.2> 解決辦法
建表時(shí)指定TBLPROPERTIES
,采用gzip 壓縮
示例:
drop table if exists ods.table_test CREATE TABLE if not exists ods.table_test( id string, open_time string ) COMMENT '測(cè)試' PARTITIONED BY (`dt` string COMMENT '按天分區(qū)') row format delimited fields terminated by '\001' STORED AS PARQUET TBLPROPERTIES ('parquet.compression'='GZIP');
執(zhí)行效果
數(shù)據(jù)文件在hdfs上顯示:
可以看到文件大小占比已經(jīng)和 *.gz.parquet 文件格式一樣了
3>saveAsTextFile寫(xiě)入直接操作文件
saveAsTextFile(self, path, compressionCodecClass=None)
該方式通過(guò)rdd 以文件形式直接將數(shù)據(jù)存儲(chǔ)在hdfs上。
示例:
rdd.saveAsTextFile('hdfs://表全路徑')
文件操作更多方式見(jiàn)官方文檔
到此這篇關(guān)于pyspark操作hive分區(qū)表及.gz.parquet和part-00000文件壓縮問(wèn)題的文章就介紹到這了,更多相關(guān)pyspark hive分區(qū)表parquet內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 實(shí)現(xiàn)微信自動(dòng)回復(fù)的方法
這篇文章主要介紹了Python 實(shí)現(xiàn)微信自動(dòng)回復(fù)的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-09-09一道題學(xué)會(huì)Python函數(shù)中形參和實(shí)參
在Python編程中,函數(shù)的形參和實(shí)參是函數(shù)定義和調(diào)用的重要概念,本文主要介紹了一道題學(xué)會(huì)Python函數(shù)中形參和實(shí)參,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01將.py文件轉(zhuǎn)化為.exe文件的詳細(xì)過(guò)程
學(xué)Python那么久了,才知道自己不會(huì)把腳本編譯成可執(zhí)行exe文件,下面這篇文章主要給大家介紹了關(guān)于將.py文件轉(zhuǎn)化為.exe文件的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09使用python PIL庫(kù)批量對(duì)圖片添加水印的過(guò)程詳解
平常我們想給某些圖片添加文字水印,方法有很多,也有很多的工具可以方便的進(jìn)行,今天主要是對(duì)PIL庫(kù)的應(yīng)用,結(jié)合Python語(yǔ)言批量對(duì)圖片添加水印,文章通過(guò)代碼示例給大家介紹的非常詳細(xì),感興趣的同學(xué)可以參考一下2023-11-11python算法學(xué)習(xí)之桶排序算法實(shí)例(分塊排序)
本代碼介紹了python算法學(xué)習(xí)中的桶排序算法實(shí)例,大家參考使用吧2013-12-12numba提升python運(yùn)行速度的實(shí)例方法
在本篇文章里小編給大家整理的是一篇關(guān)于numba提升python運(yùn)行速度的實(shí)例方法,有興趣的朋友們可以參考下。2021-01-01python實(shí)現(xiàn)決策樹(shù)ID3算法的示例代碼
這篇文章主要介紹了python實(shí)現(xiàn)決策樹(shù)ID3算法的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Flask 入門(mén)Web 微框架Hello Flask
這篇文章主要介紹了 Flask 入門(mén)Web 微框架Hello Flask,F(xiàn)lask 是一個(gè) Python 實(shí)現(xiàn)的 Web 微框架,之所以稱之為微框架,是因?yàn)?nbsp;Flask 核心簡(jiǎn)單且易于擴(kuò)展,有兩個(gè)主要依賴,WSGI工具集:Werkzeug和模板引擎:Jinja2,Flask 只保留了 Web 開(kāi)發(fā)的核心功能,需要的朋友可以參考一下2021-11-11