1

在一列中有一个空值的数据框(并非全部为空),它需要用uuid填充空值,有没有办法?如何将数据框中的空值填充到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| 
+------+--------------------+----------------+ 

如何制作它?万一有100多万行

回答

2

您可以使用UDF和​​3210来做到这一点,如下所示。

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

谢谢阿盖尔,这个作品,我会接受它作为答案。 –

0

您可以轻松地通过使用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 accrodingly:

fillDF.withColumns("field2",generateUUID(fillDF("field2"))).show 

PS:代码没有经过测试,但它应该工作!