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文档,但找不到允许我这样做的任何内容.我可能会一起使用split
和concat_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
你可以使用一个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)
我希望答案有帮助
归档时间: |
|
查看次数: |
6560 次 |
最近记录: |