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 "01" 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 "01" 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 "01" 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 "01" 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 "01" 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文件壓縮問題的文章就介紹到這了,更多相關pyspark hive分區表parquet內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.cnblogs.com/Sherry-g/p/15184002.html