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

Posted

技术标签:

【中文标题】如何将 Spark Dataframe 列转换为字符串数组的单列【英文标题】:How to transform Spark Dataframe columns to a single column of a string array 【发布时间】:2016-12-07 15:35:02 【问题描述】:

我想知道如何将多个数据框列“合并”为一个字符串数组?

例如,我有这个数据框:

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)

【问题讨论】:

【参考方案1】:

使用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]|
// +---+------------------+

【讨论】:

谢谢。这是正确的答案。但是继续前进,我遇到了下一个问题。它没有具体相关,所以我创建了一个新问题。看看吧,也许你能再次帮助我:***.com/questions/41245227/… 不错的答案,这对我有很大帮助! 我正在做这样的事情但是如何在构造数组时忽略空值? @marcia12:我一直在寻找类似的解决方案。找到link 并以此为基础从数组中过滤掉空值: def NonNullArray = udf(arry: Seq[String]) => if (arry.size >0) arry.filterNot(_ == null) 其他 null )【参考方案2】:

也可以与 withColumn 一起使用:

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

【讨论】:

以上是关于如何将 Spark Dataframe 列转换为字符串数组的单列的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Spark 2.0 中的 DataFrame 列创建数据集?

使用 Spark Dataframe scala 将多个不同的列转换为 Map 列

PySpark:Spark Dataframe - 将 ImageSchema 列转换为 nDArray 作为新列

使用 Scala 将多列转换为 Spark Dataframe 上的一列地图

Scala Spark DataFrame SQL withColumn - 如何使用函数(x:字符串)进行转换

DataFrame 列(数组类型)包含 Null 值和空数组(len =0)。如何将 Null 转换为空数组?