1

1 つの列 (すべてが null ではない) に null 値を持つデータフレームがあり、null 値を 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 行を超える場合

4

2 に答える 2

3

以下のように使用して実行でき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|
+------+--------------------+----------------+
于 2016-12-26T11:55:23.297 に答える
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 を適切に渡します。

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

PS: コードはテストされていませんが、動作するはずです!

于 2016-12-26T11:54:21.307 に答える