溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Spark SQL解析查詢parquet格式Hive表獲取分區(qū)字段和查詢條件的示例分析

發(fā)布時間:2021-12-17 09:28:46 來源:億速云 閱讀:532 作者:柒染 欄目:大數(shù)據(jù)

這篇文章給大家介紹Spark SQL解析查詢parquet格式Hive表獲取分區(qū)字段和查詢條件的示例分析,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

首先說一下,這里解決的問題應(yīng)用場景:
sparksql處理Hive表數(shù)據(jù)時,判斷加載的是否是分區(qū)表,以及分區(qū)表的字段有哪些?再進一步限制查詢分區(qū)表必須指定分區(qū)?
這里涉及到兩種情況:select SQL查詢和加載Hive表路徑的方式。這里僅就"加載Hive表路徑的方式"解析分區(qū)表字段,在處理時出現(xiàn)的一些問題及解決作出詳細(xì)說明。
如果大家有類似的需求,建議通過解析Spark SQL logical plan和下面說的這種方式解決方案結(jié)合,封裝成一個通用的工具。

問題現(xiàn)象

sparksql加載指定Hive分區(qū)表路徑,生成的DataSet沒有分區(qū)字段。

如,

sparkSession.read.format("parquet").load(s"${hive_path}"),hive_path為Hive分區(qū)表在HDFS上的存儲路徑。

hive_path的幾種指定方式會導(dǎo)致這種情況的發(fā)生(test_partition是一個Hive外部分區(qū)表,dt是它的分區(qū)字段,分區(qū)數(shù)據(jù)有dt為20200101和20200102):
1.hive_path  為"/spark/dw/test.db/test_partition/dt=20200101"
2.hive_path為"/spark/dw/test.db/test_partition/*"

因為牽涉到的源碼比較多,這里僅以示例的程序中涉及到的源碼中的class、object和方法,繪制成xmind圖如下,想細(xì)心研究的可以參考該圖到spark源碼中進行分析。

Spark SQL解析查詢parquet格式Hive表獲取分區(qū)字段和查詢條件的示例分析

問題分析

我這里主要給出幾個源碼段,結(jié)合上述xmind圖理解:  

Spark SQL解析查詢parquet格式Hive表獲取分區(qū)字段和查詢條件的示例分析

Spark SQL解析查詢parquet格式Hive表獲取分區(qū)字段和查詢條件的示例分析

在沒有指定參數(shù)basePath的情況下:

1.hive_path為/spark/dw/test.db/test_partition/dt=20200101
sparksql底層處理后得到的basePaths: Set(new Path(“/spark/dw/test.db/test_partition/dt=20200101”))【偽代碼】

leafDirs: Seq(new Path(“/spark/dw/test.db/test_partition/dt=20200101”))【偽代碼】
2.hive_path為/spark/dw/test.db/test_partition/*  
sparksql底層處理后得到的basePaths: Set(new Path(“/spark/dw/test.db/test_partition/dt=20200101”),new Path(“/spark/dw/test.db/test_partition/dt=20200102”))【偽代碼】

leafDirs: Seq(new Path(“/spark/dw/test.db/test_partition/dt=20200101”),new Path(“/spark/dw/test.db/test_partition/dt=20200102”))【偽代碼】
這兩種情況導(dǎo)致源碼if(basePaths.contains(currentPath))為true,還沒有解析分區(qū)就重置變量finished為true跳出循環(huán),因此最終生成的結(jié)果也就沒有分區(qū)字段:

Spark SQL解析查詢parquet格式Hive表獲取分區(qū)字段和查詢條件的示例分析

解決方案(親測有效)

1.在Spark SQL加載Hive表數(shù)據(jù)路徑時,指定參數(shù)basePath,如

sparkSession.read.option("basePath","/spark/dw/test.db/test_partition")
2.主要重寫basePaths方法和parsePartition方法中的處理邏輯,同時需要修改其他涉及的代碼。由于涉及需要改寫的代碼比較多,可以封裝成工具    

關(guān)于Spark SQL解析查詢parquet格式Hive表獲取分區(qū)字段和查詢條件的示例分析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI