有一个dataframe有一列有空值(不是全部为空),需要用uuid填充空值,有办法吗?
cala> val df = Seq(("stuff2",null,null), ("stuff2",null,Array("value1","value2")),("stuff3","stuff3",null)).toDF("field","field2","values")
df: org.apache.spark.sql.DataFrame = [field: string, field2: string, values: array<string>]
scala> df.show
+------+------+----------------+
| field|field2| values|
+------+------+----------------+
|stuff2| null| null|
|stuff2| null|[value1, value2]|
|stuff3|stuff3| null|
+------+------+----------------+
我尝试了这种方式,但是“field2”的每一行都有相同的uuid。
scala> val fillDF = df.na.fill(java.util.UUID.randomUUID().toString(), Seq("field2"))
fillDF: org.apache.spark.sql.DataFrame = [field: string, field2: string, values: array<string>]
scala> fillDF.show
+------+--------------------+----------------+
| field| field2| values|
+------+--------------------+----------------+
|stuff2|d007ffae-9134-4ac...| null|
|stuff2|d007ffae-9134-4ac...|[value1, value2]|
|stuff3| stuff3| null|
+------+--------------------+----------------+
如何制作?如果超过 1,000,000 行
您可以使用
UDF
和 coalesce
来完成此操作,如下所示。
import org.apache.spark.sql.functions.udf
val arr = udf(() => java.util.UUID.randomUUID().toString())
val df2 = df.withColumn("field2", coalesce(df("field2"), arr()))
df2.show()
您将获得如下所示的不同 UUID。
+------+--------------------+----------------+
| field| field2| values|
+------+--------------------+----------------+
|stuff2|fda6bc42-1265-407...| null|
|stuff2|3fa74767-abd7-405...|[value1, value2]|
|stuff3| stuff3| null|
+------+--------------------+----------------+
您可以通过使用 UDF 轻松做到这一点,它可以是这样的:
def generateUUID(value: String):String = {
import java.util.UUID
if (Option(value).isDefined) {
value
}
else {
UUID.randomUUID().toString
}
val funcUDF = generateUUID _
val generateUUID = udf(funcUDF)
现在相应地传递 fillDF:
fillDF.withColumns("field2",generateUUID(fillDF("field2"))).show
P.S:代码未经测试,但应该可以工作!
这与上面的答案或多或少相同,除了它避免使用UDF。也许当时sparkSQL中没有
uuid()
函数可用?无论如何,我认为这可能会更高效,而且,在我看来,更容易阅读
import org.apache.spark.sql.functions.{col, coalesce, expr}
val updatedDF = df.withColumn("nullable_column", coalesce(col("nullable_column"), expr("uuid()")))