繁体   English   中英

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

[英]How to append an element to an array column of a Spark Dataframe?

假设我有以下 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]|
+---+----+

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

+---+-------+
| id|nums   |
+---+-------+
|  a| [1,5] |
|  b| [1,5] |
+---+-------+

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

val df2 = df1.withColumn("nums", append(col("nums"), lit(5))) 

我查看了 Spark 的 API 文档,但找不到任何可以让我这样做的东西。 我可能可以使用splitconcat_ws一起破解某些东西,但如果可能的话,我更喜欢更优雅的解决方案。 谢谢。

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]|
+---+------+

array_union()是自array_union()年 11 月 2 日 spark 2.4.0 发布以来添加的,在您提出问题的 7 个月后,:) 请参阅https://spark.apache.org/news/index.html

您可以使用udf函数作为

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

df1.withColumn("nums", addValue(col("nums")))
  .show(false)

你应该得到

+---+------+
|id |nums  |
+---+------+
|a  |[1, 5]|
|b  |[1, 5]|
+---+------+

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

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

其中 add 是一个案例类

case class add(id: String, nums: Seq[Int])

我希望答案有帮助

如果您和我一样,正在寻找如何在 Spark SQL 语句中执行此操作; 方法如下:

%sql

select array_union(array("value 1"), array("value 2"))

您可以使用 array_union 连接两个数组。 为了能够使用它,您必须将要附加的值转换为数组。 使用 array() 函数执行此操作。

您可以输入数组(“字符串”)或数组(您的列)之类的值。

小心使用 spark array_join。 它正在删除重复项。 因此,如果您的数组中有重复的条目,您将不会得到预期的结果。 而且它至少要花费 O(N)。 因此,当我将它与数组聚合一起使用时,它变成了一个 O(N^2) 操作,并且对于一些大型 arrays 来说永远需要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM