這是我的資料集的示例。我想撰寫 Spark SQL 以將具有重復值的專案串列更改為唯一值,例如“蘋果,香蕉,香蕉”將變為“蘋果,香蕉”,我在這里撰寫了代碼:
SELECT ItemId, Date, concat_ws(',',collect_set(CAST(SPLIT(PointNameArray, ','),ARRAY<STRING>))) AS VarN
FROM dataset
但我不斷收到錯誤說明
PointNameArray由于資料型別不匹配,無法決議 'concat_ws(',', collect_set(split(dataset. , ',')))':引數 2 需要(陣列或字串)型別,但是,'collect_set(split(dataset.PointNameArray, ' ,'))) ' ,'))' 是 array<array>

itemlist 的結果是
apple, banana
phone, computer
table, chair
所以表格應該是這樣的

uj5u.com熱心網友回復:
你收到錯誤:
由于資料型別不匹配,無法決議 'concat_ws(',', collect_set(split(dataset.PointNameArray, ',')))':引數 2 需要(陣列或字串)型別,但是,'collect_set(split(dataset.PointNameArray, ',')))' , ','))' 是陣列
因為split已經回傳 an array<string>andcollect_set將整個陣列視為集合中的單個條目,因此 and array<array<string>>。
應該注意的是,collect_set是一個聚合函式,可以通過或作為每行上的視窗函式應用在一個組中。然而,將它作為視窗函式應用在每一行上會冒整個拆分陣列被視為一個不是目標的元素的風險。
此外,當您對split某些資料 ( 'apple, banana, banana) by 進行采樣時,,有些可能 在值前有空格 ( ) 并且與 banana不同banana。為了確保我們擁有獨特的價值,我們可以trim這樣做。
由于您使用的是 spark sql,下面的示例將使用 spark-sql 而不是 python/scala apis,后者可以遵循相同的方法
之前的示例資料框
------ ---------- ---------------------
|ItemId|Date |itemList |
------ ---------- ---------------------
|item1 |2019-01-01|apple, banana, banana|
------ ---------- ---------------------
擬議守則
SELECT
ItemId,
Date,
concat_ws(',',collect_set(trim(isplit))) as VarN
FROM
df
LATERAL VIEW explode(SPLIT(itemList,',')) as isplit
GROUP BY ItemId, Date
輸出之后
------ ---------- ------------
|ItemId|Date |VarN |
------ ---------- ------------
|item1 |2019-01-01|apple,banana|
------ ---------- ------------
在上面的示例代碼中,資料是:
,使用拆分SPLIT(itemList,',')explode(SPLIT(itemList,','))在橫向視圖輸出中使用分解成多行
------ ---------- -------
|ItemId|Date |isplit |
------ ---------- -------
|item1 |2019-01-01|apple |
|item1 |2019-01-01| banana|
|item1 |2019-01-01| banana|
------ ---------- -------
- 然后使用修剪資料以洗掉空格
trim(isplit) - 然后,我們使用
collect_set將提供我們唯一值的資料聚合,在其他列上分組ItemId, Date。注意。如果你有很多列,你可以在唯一的列上分組,例如ItemId,簡單地MAX在其他列上使用,例如
SELECT
ItemId,
MAX(Date) as Date,
concat_ws(',',collect_set(trim(isplit))) as VarN
FROM
df
LATERAL VIEW explode(SPLIT(itemList,',')) as isplit
GROUP BY ItemId
- 最后,我們使用連接這些值
concat_ws
uj5u.com熱心網友回復:
我認為您想使用array_distinct函式而不是collect_set:
spark.sql("""
SELECT ItemId,
Date,
PointNameArray,
concat_ws(',',array_distinct(split(PointNameArray, ','))) AS VarN
FROM dataset
""").show(truncate=False)
# ------ ---------- ------------------------- --------------
#|ItemId|Date |PointNameArray |VarN |
# ------ ---------- ------------------------- --------------
#|item1 |2019-01-01|apple,banana,apple,banana|apple,banana |
#|item2 |2019-01-01|phone,computer,computer |phone,computer|
#|item3 |2019-01-01|table,chair,table,chair |table,chair |
# ------ ---------- ------------------------- --------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/353007.html
