取消
顯示的結果
而不是尋找
你的意思是:

火花SQL的Group by副本,collect_list和評估的結構體數組行每組中。

tusworten
新的貢獻者二世

我發出召喚使用火花SQL的Java API。我有一個數據集與重複客戶按實體和DOCUMENT_ID分組如下:

.withColumn (“ROWNUMBER row_number () .over(窗口。partitionBy(“實體”,“ENTITY_DOC”) .orderBy (" ID ")))

1我添加了一個ROWNUMBER列知道有多少客戶(我要比較)為每個組。這個想法是為了評估標準在第一行和第二之間,直到組完成和最好的。這是決定最好的基於某些業務標準:

/ /標準1(最好是ID與塊0)= 0或“VS塊1,2或3 / /標準2(最好是ID 2塊)= 2塊與塊1或3 / / criteria3(最好是ID與塊3)= 3塊與塊1 / / criteria4(最好的是最近的一個時間戳)阻塞1 - 1或* *如果阻塞2 - 2或3 - 3 0 - 0以下標準/評估/ criteria5(最好是ID與typedoc 01、02、03、04年和07年類型DOC 01、02、03、04年,07年與其他/ / criteria6(最好的是最近的一個時間戳)類型DOC 01、02、03、04年,07年VS類型DOC 01、02、03、04年,07年

現在我在每組比較,雙行,以決定哪些是最好的。這是大問題,我不知道如果它更好的創建一個結構體數組,地圖……我不知道如何遍曆每一行在同一組。一個例子:

如果entity_doc實體“182”“000004693 r”有3場比賽,我們要比較:第一,行(1)- > ID 5254578行(2)ID - > 99841470。* *行(1)將是最好的因為標準1。訂單後,我們以前比較最好的行(1)- > ID 5254578 VS行(3)ID - > 45866239。* *行(1)將是最好的因為標準1。

我試圖在一個組的每一行組collect_list但我不知道如何訪問每個元素比較它與未來:

根|——實體:字符串(nullable = true) |——ENTITY_DOC:字符串(nullable = true) |——COMBINED_LIST:數組(nullable = true) | |——元素:結構(containsNull = false) | | | - ID:字符串(nullable = true) | | | -布洛克:字符串(nullable = true) | | |——TYPE_DOC:字符串(nullable = true) | | |——AUD_TIMESTAM:時間戳(nullable = true)第一組的例子:+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |實體ENTITY_DOC | COMBINED_LIST + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - r | 182 | 000004693 |[[5254578, 0 01 2005-07-07 01:03:25.613802],[02 99841470, 1日,2005-07-07 01:03:25.613802],[01 45866239,3日,2000-01-16 09:07:00]]|

最好的輸出將是一個元組ID和其他ID:

+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - | + |實體ENTITY_DOC | ID1 | ID2 | COD_CRITERIA | + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - r + | 182 | 000004693 | 5254578 | 5254578 | 1 | r | 182 | 000004693 | 5254578 | 5254578 | 1 |

你能幫我與火花?謝謝!

5回複5

匿名
不適用

你好,@tusWorten TW !我的名字是風笛手,在這裏我是一個主持人磚。歡迎來到社區和謝謝你帶你的問題。讓我們給社區一個機會做出反應,然後如果我們需要,我們會回來。

Hubert_Dudek1
尊敬的貢獻者三世

在我看來你把好方向分組collect_list(一般數組或地圖)是路要走。

你需要寫函數比較元素和注冊為用戶定義函數。你甚至可以使用多個列數組並將它們傳遞給函數,返回您所需要的。函數可以處理任何與if和else邏輯。

這是互聯網的示例代碼用於比較兩個數組。你可以找到許多例子通過搜索“火花udf”:

進口scala.collection.mutable。WrappedArray org.apache.spark.sql.functions進口。坳val same_elements = udf{(答:WrappedArray [String] b: WrappedArray [String]) = >如果(a.intersect (b) . length = = b.length)其他{1}{0}}df.withColumn(“測試”,same_elements卡紮菲(col (“array1”), (“array2”)))

Kaniz
社區經理
社區經理

嗨@tusWorten TW, @Hubert杜德克的回答幫助你嗎?

tusworten
新的貢獻者二世

嗨@Kaniz開羅

她的回答沒有解決我的問題,但它是有用的,了解更多關於udf,這我不知道。

歡迎來到磚社區:讓學習、網絡和一起慶祝

加入我們的快速增長的數據專業人員和專家的80 k +社區成員,準備發現,幫助和合作而做出有意義的聯係。

點擊在這裏注冊今天,加入!

參與令人興奮的技術討論,加入一個組與你的同事和滿足我們的成員。

Baidu
map