如何将 Spark Dataframe 的列转换为字符串数组的单个列

9
我可以帮您将多个数据框列合并为一个字符串数组吗?
例如,我有这个数据框:
val df = sqlContext.createDataFrame(Seq((1, "Jack", "125", "Text"), (2,"Mary", "152", "Text2"))).toDF("Id", "Name", "Number", "Comment")

这是一个例子:

它看起来像这样:

scala> df.show
+---+----+------+-------+
| Id|Name|Number|Comment|
+---+----+------+-------+
|  1|Jack|   125|   Text|
|  2|Mary|   152|  Text2|
+---+----+------+-------+

scala> df.printSchema
root
 |-- Id: integer (nullable = false)
 |-- Name: string (nullable = true)
 |-- Number: string (nullable = true)
 |-- Comment: string (nullable = true)

我该如何进行转换,使其看起来像这样:

scala> df.show
+---+-----------------+
| Id|             List|
+---+-----------------+
|  1|  [Jack,125,Text]|
|  2| [Mary,152,Text2]|
+---+-----------------+

scala> df.printSchema
root
 |-- Id: integer (nullable = false)
 |-- List: Array (nullable = true)
 |    |-- element: string (containsNull = true)
2个回答

17

使用org.apache.spark.sql.functions.array

import org.apache.spark.sql.functions._
val result = df.select($"Id", array($"Name", $"Number", $"Comment") as "List")

result.show()
// +---+------------------+
// |Id |List              |
// +---+------------------+
// |1  |[Jack, 125, Text] |
// |2  |[Mary, 152, Text2]|
// +---+------------------+

谢谢。这是正确的答案。但是在继续进行时,我遇到了下一个问题。它不是特别相关的,所以我创建了一个新的问题。请查看一下,也许你可以再次帮助我:https://dev59.com/qZ3ha4cB1Zd3GeqPVoNG - V. Samma
很好的答案,这对我帮助很大! - Claudio Cavalcante
我正在做类似的事情,但如何在构建数组时忽略空值? - marcia12
@marcia12: 我正在寻找类似的解决方案。找到了链接,并以此为基础过滤掉数组中的null值: def NonNullArray = udf(arry: Seq[String]) => if (arry.size >0) { arry.filterNot(_ == null) } else { null }) - B. Griffiths

0

还可以与withColumn一起使用:

import org.apache.spark.sql.functions as F
   
df.withColumn("Id", F.array(F.col("Name"), F.col("Number"), F.col("Comment")))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接