Предполагая, что кадр данных 1 представляет целевую страну и список стран-источников, а кадр данных 2 представляет доступность для всех стран, найдите все пары из кадра данных 1, где отображение целевой страны равно ИСТИНА и страна-источник отображение FALSE :
Dataframe 1 (targetId, sourceId):
США: Китай, Россия, Индия, Япония
Китай: США, Россия , Индия
Россия: США, Япония
Рамка данных 2 (идентификатор, доступен):
США: правда
Китай: ложь
Россия: правда
Индия: false
Япония: true
Результат Набор данных должен выглядеть следующим образом:
(США, Китай),
(США, Индия)
Моя идея состоит в том, чтобы сначала взорвать набор данных1, создать новый фрейм данных (скажем, tempDF), добавить в него 2 новых столбца: targetAvailable, sourceAvailable и, наконец, отфильтровать для targetAvailable = false и sourceAvailable = true, чтобы получить требуемый фрейм данных результата.
Ниже приведен фрагмент моего кода:
val sourceDF = sourceData.toDF("targetId", "sourceId")
val mappingDF = mappingData.toDF("id", "available")
val tempDF = sourceDF.select(col("targetId"),
explode(col("sourceId")).as("source_id_split"))
val resultDF = tempDF.select("targetId")
.withColumn("targetAvailable", isAvailable(tempDF.col("targetId")))
.withColumn("sourceAvailable", isAvailable(tempDF.col("source_id_split")))
/*resultDF.select("targetId", "sourceId").
filter(col("targetAvailable") === "true" and col("sourceAvailable")
=== "false").show()*/
// udf to find the availability value for the given id from the mapping table
val isAvailable = udf((searchId: String) => {
val rows = mappingDF.select("available")
.filter(col("id") === searchId).collect()
if (rows(0)(0).toString.equals("true")) "true" else "false" })
Вызов isAvailable
UDF при вычислении resultDF
вызывает у меня странное исключение. Я делаю что-то неправильно? Есть ли лучший / простой способ сделать это?