1

Существует блок данных с нулевыми значениями в одном столбце (не все равны нулю), необходимо заполнить нулевое значение с помощью uuid, есть ли способ?Как заполнить нулевое значение в 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| 
+------+--------------------+----------------+ 

Как это сделать? в случае, если имеется более 1000000 строк

ответ

2

Вы можете сделать это, используя 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| 
+------+--------------------+----------------+ 
+0

Спасибо abaghel, это работает, и я буду принимать его как ответ. –

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: Код не проверен, но он должен работать!