Spark scala 从多列中获取字符串类型的数组
Spark scala get an array of type string from multiple columns
我在 scala 中使用 spark。
想象一下输入:
我想知道如何获得以下输出[参见下图中的累加器列],它应该是一个 String 类型的数组 Array[String]
在我的真实数据框中,我有超过 3 列。我有几千个专栏。
如何才能获得我想要的输出?
您可以使用 array
函数并映射一系列列:
import org.apache.spark.sql.functions.{array, col, udf}
val tmp = array(df.columns.map(c => when(col(c) =!= 0, c)):_*)
哪里
when(col(c) =!= 0, c)
如果列值不为零则采用列名,否则为空。
并使用 UDF 过滤空值:
val dropNulls = udf((xs: Seq[String]) => xs.flatMap(Option(_)))
df.withColumn("accumulator", dropNulls(tmp))
所以对于示例数据:
val df = Seq((1, 0, 1), (0, 1, 1), (1, 0, 0)).toDF("apple", "orange", "kiwi")
你首先得到:
+-----+------+----+--------------------+
|apple|orange|kiwi| tmp|
+-----+------+----+--------------------+
| 1| 0| 1| [apple, null, kiwi]|
| 0| 1| 1|[null, orange, kiwi]|
| 1| 0| 0| [apple, null, null]|
+-----+------+----+--------------------+
最后:
+-----+------+----+--------------+
|apple|orange|kiwi| accumulator|
+-----+------+----+--------------+
| 1| 0| 1| [apple, kiwi]|
| 0| 1| 1|[orange, kiwi]|
| 1| 0| 0| [apple]|
+-----+------+----+--------------+
我在 scala 中使用 spark。
想象一下输入:
我想知道如何获得以下输出[参见下图中的累加器列],它应该是一个 String 类型的数组 Array[String]
在我的真实数据框中,我有超过 3 列。我有几千个专栏。
如何才能获得我想要的输出?
您可以使用 array
函数并映射一系列列:
import org.apache.spark.sql.functions.{array, col, udf}
val tmp = array(df.columns.map(c => when(col(c) =!= 0, c)):_*)
哪里
when(col(c) =!= 0, c)
如果列值不为零则采用列名,否则为空。
并使用 UDF 过滤空值:
val dropNulls = udf((xs: Seq[String]) => xs.flatMap(Option(_)))
df.withColumn("accumulator", dropNulls(tmp))
所以对于示例数据:
val df = Seq((1, 0, 1), (0, 1, 1), (1, 0, 0)).toDF("apple", "orange", "kiwi")
你首先得到:
+-----+------+----+--------------------+
|apple|orange|kiwi| tmp|
+-----+------+----+--------------------+
| 1| 0| 1| [apple, null, kiwi]|
| 0| 1| 1|[null, orange, kiwi]|
| 1| 0| 0| [apple, null, null]|
+-----+------+----+--------------------+
最后:
+-----+------+----+--------------+
|apple|orange|kiwi| accumulator|
+-----+------+----+--------------+
| 1| 0| 1| [apple, kiwi]|
| 0| 1| 1|[orange, kiwi]|
| 1| 0| 0| [apple]|
+-----+------+----+--------------+