scala - 如何将dataframe中的空值填充到uuid?

标签 scala apache-spark apache-spark-sql apache-spark-dataset

有一个数据框有一列为空值(并非全部为空),需要用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 行

最佳答案

您可以使用 UDFcoalesce 来完成此操作,如下所示。

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

关于scala - 如何将dataframe中的空值填充到uuid?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41330387/

相关文章:

scala - 无法在 aws EMR 上运行 jar 或 SparkApplication

java - scala导入没有包名的包对象

scala - 为什么在 val 变量上使用 += 和 a=x+y 时会出现不同的错误消息?

apache-spark - Spark submit 会自动将 jar 上传到集群吗?

multithreading - spark.task.cpus 和 --executor-cores 有什么区别

apache-spark - 此查询不支持从检查点位置恢复。删除 checkpoint/testmemeory/offsets 重新开始

python - 在 pyspark 中使用 arraytype 列创建数据框

hadoop - Spark-SQL 在 yarn-cluster 上的错误 hdfs 权限

scala - Typeclass 的模棱两可的隐含值

python - 根据用户 ID PySpark 在训练测试中分割行