Scala Spark Заменить пустую строку на NULL - PullRequest
0 голосов
/ 24 сентября 2018

Здесь я хочу заменить значение в определенном столбце на ноль, если оно пустое. String.

Причина в том, что я использую org.apache.spark.sql.functions.coalesce для заполнения одного столбца Dataframe на основе других столбцов,но я заметил в некоторых строках значение empty String вместо null, поэтому функция coalesce работает не так, как ожидалось.

val myCoalesceColumnorder: Seq[String] = Seq("xx", "yy", "zz"),

val resolvedDf = df.select(
   df("a"),
   df("b"),
   lower(org.apache.spark.sql.functions.coalesce(myCoalesceColumnorder.map(x => adjust(x)): _*)).as("resolved_id")
)

В приведенном выше примере я ожидал, что сначала заполнюresolved_id со столбцом xx, если он не равен нулю и если он равен нулю со столбцом yy и так далее.Но так как иногда столбец xx заполняется "" вместо нуля, я получаю "" в 'resolved_id'.

Я пытался исправить это с помощью

resolvedDf.na.replace("resolved_id", Map("" -> null))

Но на основев документации na.replace он работает только в том случае, если ключ и значение либо Bolean, либо String, либо Double, поэтому я не могу использовать null здесь.

Я не хочу использоватьUDF из-за проблемы с производительностью, я просто хочу знать, есть ли другой способ решить эту проблему?

Еще один способ исправить это с помощью when, ноне уверен насчет производительности

resolvedDf
      .withColumn("resolved_id", when(col("resolved_id").equalTo(""), null).otherwise(col("resolved_id")))

1 Ответ

0 голосов
/ 24 сентября 2018

Это правильный путь с лучшей производительностью
resolvedDf.withColumn("resolved_id", when($"resolved_id" !== "", $"resolved_id"))

В принципе нет необходимости использовать otherwise метод.

Вы можете проверить источники ::: https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/Column.scala#L507

/**
   * Evaluates a list of conditions and returns one of multiple possible result expressions.
   * If otherwise is not defined at the end, null is returned for unmatched conditions.
   *
   * {{{
   *   // Example: encoding gender string column into integer.
   *
   *   // Scala:
   *   people.select(when(people("gender") === "male", 0)
   *     .when(people("gender") === "female", 1)
   *     .otherwise(2))
   *
   *   // Java:
   *   people.select(when(col("gender").equalTo("male"), 0)
   *     .when(col("gender").equalTo("female"), 1)
   *     .otherwise(2))
   * }}}
   *
   * @group expr_ops
   * @since 1.4.0
   */
  def when(condition: Column, value: Any): Column = this.expr match {
    case CaseWhen(branches, None) =>
      withExpr { CaseWhen(branches :+ ((condition.expr, lit(value).expr))) }
    case CaseWhen(branches, Some(_)) =>
      throw new IllegalArgumentException(
        "when() cannot be applied once otherwise() is applied")
    case _ =>
      throw new IllegalArgumentException(
        "when() can only be applied on a Column previously generated by when() function")
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...