如何将元素追加到Spark Dataframe的数组列?

Sha*_*mal 8 scala apache-spark

假设我有以下DataFrame:

scala> val df1 = Seq("a", "b").toDF("id").withColumn("nums", array(lit(1)))
df1: org.apache.spark.sql.DataFrame = [id: string, nums: array<int>]

scala> df1.show()
+---+----+
| id|nums|
+---+----+
|  a| [1]|
|  b| [1]|
+---+----+
Run Code Online (Sandbox Code Playgroud)

我想在nums列中向数组中添加元素,以便得到如下内容:

+---+-------+
| id|nums   |
+---+-------+
|  a| [1,5] |
|  b| [1,5] |
+---+-------+
Run Code Online (Sandbox Code Playgroud)

有没有办法使用.withColumn()DataFrame 的方法来做到这一点?例如

val df2 = df1.withColumn("nums", append(col("nums"), lit(5))) 
Run Code Online (Sandbox Code Playgroud)

我查看了Spark的API文档,但找不到允许我这样做的任何内容.我可能会一起使用splitconcat_ws破解某些东西,但如果有可能的话,我宁愿选择更优雅的解决方案.谢谢.

小智 9

import org.apache.spark.sql.functions.{lit, array, array_union}

val df1 = Seq("a", "b").toDF("id").withColumn("nums", array(lit(1)))
val df2 = df1.withColumn("nums", array_union($"nums", lit(Array(5))))
df2.show

+---+------+
| id|  nums|
+---+------+
|  a|[1, 5]|
|  b|[1, 5]|
+---+------+
Run Code Online (Sandbox Code Playgroud)

array_union()自火花2.4.0在2018年11月2日,你问的问题后7个月发行版中添加,:)看到https://spark.apache.org/news/index.html


Ram*_*jan 5

你可以使用一个udf函数来做到这一点

def addValue = udf((array: Seq[Int])=> array ++ Array(5))

df1.withColumn("nums", addValue(col("nums")))
  .show(false)
Run Code Online (Sandbox Code Playgroud)

你应该得到

+---+------+
|id |nums  |
+---+------+
|a  |[1, 5]|
|b  |[1, 5]|
+---+------+
Run Code Online (Sandbox Code Playgroud)

更新的 替代方法是使用数据集方式并使用地图作为

df1.map(row => add(row.getAs[String]("id"), row.getAs[Seq[Int]]("nums")++Seq(5)))
  .show(false)
Run Code Online (Sandbox Code Playgroud)

其中 add 是一个案例类

case class add(id: String, nums: Seq[Int])
Run Code Online (Sandbox Code Playgroud)

我希望答案有帮助