TL; DR: есть ли в Spark нулевой безопасный оператор between
?
Я знаю о <=>
, но он становится немного многословным и менее читаемым, когда мне нужно выполнить between
операция.
Если дать немного контекста, у меня есть оценка в таблице A, а также верхние и нижние пределы оценки в таблице B. Мне нужно объединить их, когда оценка в таблице A находится между пределами оценки. в таблице B. Дело в том, что когда оценка в таблице A равна нулю, ее следует сравнить с нулевым верхним и нижним пределами в таблице B.
Немного кода для уточнения:
import org.apache.spark.sql.types._
/* Helper function to generate DataFrames the verbose way, which was
chosen because I wasn't able to mock these DataFrames containing null
values in numeric columns without specifying the schema - Scala was
sending the data as "AnyVal", and Spark wasn't happy about it */
def generateDataFrame(data: List[Row], schema: List[StructField]): DataFrame = {
spark.createDataFrame(
sc.parallelize(data),
StructType(schema)
)
}
/************************* DataFrame mocking *********************/
val tableASchema = List(
StructField("player", StringType),
StructField("score", DoubleType)
)
val tableAData = List(
Row("player1", 450.0),
Row("player2", null)
)
val tableA = generateDataFrame(tableAData, tableASchema)
val tableBSchema = List(
StructField("lower_limit", IntegerType),
StructField("upper_limit", IntegerType),
StructField("band", StringType)
)
val tableBData = List(
Row(null, null, "noScore"),
Row(400, 500, "400-500")
)
val tableB = generateDataFrame(tableBData, tableBSchema)
/************************* Join - the problem itself *********************/
val currentSolution = tableA.join(
tableB,
when($"score".isNull, $"score" <=> $"lower_limit" and $"score" <=> $"upper_limit")
.otherwise($"score" between($"lower_limit", $"upper_limit")),
"left"
)
val intendedSolution = tableA.join(
tableB,
$"score" safeBetween($"lower_limit", $"upper_limit")
"left"
)
Разница между предполагаемой и текущей является только читаемость. Есть ли такой метод, как safeBetween?