3 回答

TA貢獻1815條經驗 獲得超10個贊
對于這個用例,您可以使用pivot
:
ds
?.withColumn("pivot_column", $"first_column")
?.groupBy($"first_column")
?.pivot("pivot_column")
?.count
如果你想要更好的性能,你可能想在 pivot 中提供可能的值,比如pivot("pivot_column", Seq("a", "b", "c"))
我用于count聚合,但你可以進行任何你想要的聚合。
From
+------------+
|first_column|?
+------------+
| a? ? ? ? ? |?
| b? ? ? ? ? |
| c? ? ? ? ? |
+------------+
To
+------------+---+---+---+
|first_column| a | b | c |
+------------+---+---+---+
| a? ? ? ? ? | 1 | 0 | 0 |
| b? ? ? ? ? | 0 | 1 | 0 |
| c? ? ? ? ? | 0 | 0 | 1 |
+------------+---+---+---+

TA貢獻1848條經驗 獲得超10個贊
如果的值Column是最小的/更少,請嘗試下面的代碼。
df.show
+------+
|Column|
+------+
| A|
| B|
| C|
+------+
// If you have multiple columns are exist, select only required column
val names = df.select($"Column").as[String].collect
val df1 = names.foldLeft(df)((df,n) => df.withColumn(n, lit(0)))
df1.show()
+------+---+---+---+
|Column| A| B| C|
+------+---+---+---+
| A| 0| 0| 0|
| B| 0| 0| 0|
| C| 0| 0| 0|
+------+---+---+---+

TA貢獻1843條經驗 獲得超7個贊
我認為 Spark 的本質(更準確地說,它的并行性)不允許您使用 UDF 實現(xiàn)您的目標。
執(zhí)行查詢時,Spark 將數(shù)據(jù)分發(fā)給執(zhí)行器,每個執(zhí)行器都有自己的行塊。每個行塊都有自己的列的可能值列表Column
。因此,每個執(zhí)行者都會嘗試添加自己的列列表,這與其他執(zhí)行者所做的不同。因此,當驅動程序嘗試合并來自不同執(zhí)行程序的結果集時,它會失?。ɑ蛘邎?zhí)行程序可能會失敗)。
collectAsList
確實解決了你的問題,雖然效率很低。
此外,您可以猜測列數(shù)并發(fā)明一些函數(shù)(適合您的實際數(shù)據(jù))來將列獲得的值映射Column
到這些數(shù)字 - 這樣您就可以使每個執(zhí)行程序的列集保持相等。該解決方案不是很通用,但可以解決某些情況。即,您會得到像這樣的列:<c01, c02, c03, ..., cNN>
。
添加回答
舉報