Во-первых, из-за трех значений 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 исследование отрывочных данных, поэтому я могу ответить на вопросы типа "Я не знаю" не знаю, что такое столбцы, но скажите, как часто они содержат фактические значения "полезно.)