Предполагая, что фрейм данных 1 представляет целевую страну и список исходных стран, а фрейм данных 2 представляет доступность для всех стран, найдите все пары из фрейма данных 1, где сопоставление целевой страны ИСТИНА, а сопоставление исходной страны равно ЛОЖЬ:
Dataframe 1 (targetId, sourceId):
США: Китай, Россия, Индия, Япония
Китай: США, Россия, Индия
Россия: США, Япония
Dataframe 2 (идентификатор, доступен):
США: true
Китай: false
Россия: true
Индия: 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
вызывает у меня какое-то странное исключение. Я делаю что-то неправильно? есть ли лучший/более простой способ сделать это?