簡體   English   中英

使用列表觸發“加入” DataFrame並返回字符串

[英]Spark 'join' DataFrame with List and return String

我有以下DataFrame:

DF1:
+------+---------+
|key1  |Value    |
+------+---------+
|[k, l]|      1  |
|[m, n]|      2  |
|[o]   |      3  |
+------+---------+

需要與另一個數據框“聯接”

DF2:
+----+
|key2|
+----+
|k   |
|l   |
|m   |
|n   |
|o   |
+----+

這樣輸出看起來像這樣:

DF3:
+--------------------+---------+
|key3                |Value    |
+--------------------+---------+
|k:1 l:1 m:0 n:0 o:0 |      1  |
|k:0 l:0 m:1 n:1 o:0 |      2  |
|k:0 l:0 m:0 n:0 o:1 |      3  |
+--------------------+---------+

換句話說,輸出數據幀應具有一列,該列是DF2中所有行的字符串,並且每個元素后均應帶有1或0,指示該元素是否存在於DF1列key1的列表中。

我不確定如何去做。 我可以寫一個簡單的UDF來完成我想要的嗎?

對於DF2這樣的操作,可以使用udf

import spark.implicits._
import org.apache.spark.sql.functions._

val df1 = Seq(
  (Seq("k", "l"), 1), (Seq("m", "n"), 2), (Seq("o"), 3)
).toDF("key1", "value")
val df2 = Seq("k", "l", "m", "n", "o").toDF("key2")

val keys = df2.as[String].collect.map((_, 0)).toMap

val toKeyMap = udf((xs: Seq[String]) => 
   xs.foldLeft(keys)((acc, x) => acc + (x -> 1)))


df1.select(toKeyMap($"key1").alias("key3"), $"value").show(false)

// +-------------------------------------------+-----+
// |key3                                       |value|
// +-------------------------------------------+-----+
// |Map(n -> 0, m -> 0, l -> 1, k -> 1, o -> 0)|1    |
// |Map(n -> 1, m -> 1, l -> 0, k -> 0, o -> 0)|2    |
// |Map(n -> 0, m -> 0, l -> 0, k -> 0, o -> 1)|3    |
// +-------------------------------------------+-----+

如果只需要一個字符串:

val toKeyMapString = udf((xs: Seq[String]) => 
   xs.foldLeft(keys)((acc, x) => acc + (x -> 1))
     .map { case (k, v) => s"$k: $v" }
     .mkString(" ")
)


df1.select(toKeyMapString($"key1").alias("key3"), $"value").show(false)
// +------------------------+-----+
// |key3                    |value|
// +------------------------+-----+
// |n: 0 m: 0 l: 1 k: 1 o: 0|1    |
// |n: 1 m: 1 l: 0 k: 0 o: 0|2    |
// |n: 0 m: 0 l: 0 k: 0 o: 1|3    |
// +------------------------+-----+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM