我發出召喚使用火花SQL的Java API。我有一個數據集與重複客戶按實體和DOCUMENT_ID分組如下:
.withColumn (“ROWNUMBER row_number () .over(窗口。partitionBy(“實體”,“ENTITY_DOC”) .orderBy (" ID ")))
我添加了一個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 |
你能幫我與火花?謝謝!
在我看來你把好方向分組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”)))