Spark Scala: проверить, не является ли строка пустой или пустой - PullRequest
0 голосов
/ 13 февраля 2020

Во-первых, из-за трех значений logi c, это не просто отрицание какой-либо действительной реализации проверки на ноль или пустоту.

Я хочу сделать функцию isNotNullish, которая максимально приближена к isNotNull, но также отфильтровывает пустые строки. Я сталкиваюсь с некоторыми странностями, связанными с тем, как работают типы столбцов / столбцов, а также с тремя значениями logi c. Пока лучшее, что у меня есть:

def isNotNullish(questionable: Column) : Column = {
  val oddish = questionable === lit("")
  questionable.isNotNull && (!oddish || oddish.isNull)
}

Если это выглядит странно, то это потому, что это так. Насколько я могу судить, questionable === lit("") вернет null для данной строки, если эта строка содержит нулевой или (некоторый!) Нестроковый тип. В логах с тремя значениями c, true && null = null, что приведет к тому, что questionable.isNotNull && (questionable =!= lit("") вернет null в некоторых случаях, когда я хочу, чтобы оно вернуло true. Код questionable.isNotNull && (!oddish || oddish.isNull) никогда не должен давать значение null, всегда true или false.

Это почти не совсем работает: по какой-то причине я не понимаю, сравнение === с удовольствием возвращает null для числовых c типов, но не для сложных типов. (Даже если то, что я пытаюсь сделать, невозможно или нецелесообразно, я бы с удовольствием объяснил это.)

Может быть более ответственным проверить схему и просто выполнить другой тест для строковых типов, чем для других, но, насколько я могу судить, это требует, чтобы датафрейм передавался как параметр. Я пытаюсь избежать этого, особенно для длинных последовательностей преобразований, где указанный параметр может быть анонимным.

(Прежде чем кто-либо спросит, я знаю, что работа с null и типами в этом неаккуратном способе будет вообще ужасной scala, но я думаю, что это отличается в контексте Spark / SQL / огромных фреймов данных с изменяющейся схемой. Конкретный случай c - это автоматическое c исследование отрывочных данных, поэтому я могу ответить на вопросы типа "Я не знаю" не знаю, что такое столбцы, но скажите, как часто они содержат фактические значения "полезно.)

1 Ответ

2 голосов
/ 13 февраля 2020

Работает ли это для вас <=>

    val employees = spark.createDataFrame(Seq(("E1","100.0"), ("E2","200.0"),("E3",null),("E4",""))).toDF("employee","salary")
    employees.show()
    employees.filter(notNullAndEmpty($"salary")).show()

  def notNullAndEmpty(c:Column): Column ={
    (c.isNotNull and !(c <=> lit("")))
  }

Данные -

+--------+------+
|employee|salary|
+--------+------+
|      E1| 100.0|
|      E2| 200.0|
|      E3|  null|
|      E4|      |
+--------+------+

Результат

+--------+------+
|employee|salary|
+--------+------+
|      E1| 100.0|
|      E2| 200.0|
+--------+------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...