【发布时间】:2019-10-29 06:06:43
【问题描述】:
我有一个数据框:
+--------------------+------+
|people |person|
+--------------------+------+
|[[jack, jill, hero]]|joker |
+--------------------+------+
这是架构:
root
|-- people: struct (nullable = true)
| |-- person: array (nullable = true)
| | |-- element: string (containsNull = true)
|-- person: string (nullable = true)
这里,root--person 是一个字符串。所以,我可以使用 udf 更新这个字段:
def updateString = udf((s: String) => {
"Mr. " + s
})
df.withColumn("person", updateString(col("person"))).select("person").show(false)
输出:
+---------+
|person |
+---------+
|Mr. joker|
+---------+
我想对包含人员数组的 root--people--person 列执行相同的操作。如何使用 udf 实现这一点?
def updateArray = udf((arr: Seq[Row]) => ???
df.withColumn("people", updateArray(col("people.person"))).select("people").show(false)
预期:
+------------------------------+
|people |
+------------------------------+
|[Mr. hero, Mr. jack, Mr. jill]|
+------------------------------+
编辑:我还想在更新 root--people--person 后保留其架构。
人的预期模式:
df.select("people").printSchema()
root
|-- people: struct (nullable = false)
| |-- person: array (nullable = true)
| | |-- element: string (containsNull = true)
谢谢,
【问题讨论】:
标签: scala apache-spark apache-spark-sql user-defined-functions