Полагаю, вы можете захотеть сделать что-то вроде следующего:
InputDF.where("firstValue >= 0.5 and secondValue >= 0.5 and thirdValue >= 0.5")
Ошибка, с которой вы сталкиваетесь, является ошибкой разбора во время выполнения, если ошибка была вызвана неверным типом, переданным в нее, не будетдаже скомпилированы.
Как вы можете видеть в официальной документации (здесь приведено для Spark 2.3.0), метод where
может принимать последовательность Column
с (например,в вашем последнем фрагменте) или строку, представляющую предикат SQL (как в моем примере).
Предикат SQL будет интерпретироваться Spark.Однако я считаю, что стоит упомянуть, что вам может быть интересно составить Column
вместо конкатенации строк, поскольку первый подход минимизирует поверхность ошибки, избавляясь от целых классов возможных ошибок (например, ошибок синтаксического анализа).
То же самое можно сделать с помощью следующего кода:
InputDF.where(col("firstValue") >= 0.5 and col("secondValue") >= 0.5 and col("thirdValue") >= 0.5)
или более кратко:
import spark.implicits._ // necessary for the $"" notation
InputDF.where($"firstValue" >= 0.5 and $"secondValue" >= 0.5 and $"thirdValue" >= 0.5)
Column
s легко компонуются и более надежны, чем необработанные строки.Если вы хотите, чтобы набор условий применялся, вы можете легко and
объединить их в функцию, которая может быть проверена даже перед тем, как вы даже запустите программу:
def allSatisfied(condition: Column, conditions: Column*): Column =
conditions.foldLeft(condition)(_ and _)
InputDF.where(allSatisfied($"firstValue" >= 0.5, $"secondValue" >= 0.5, $"thirdValue" >= 0.5))
Вы можете достичь того же с помощью строк, конечно, но это в конечном итоге будет менее надежным:
def allSatisfied(condition: String, conditions: String*): String =
conditions.foldLeft(condition)(_ + " and " + _)
InputDF.where(allSatisfied("firstValue >= 0.5", "secondValue >= 0.5", "thirdValue >= 0.5"))