假设数据框1代表目标国家,来源国列表,数据框2代表所有国家/地区的可用性,从数据框1中找到所有对,其中目标国家/地区映射为TRUE,源国家/地区映射为< [FALSE ::> Dataframe 1(targetId,sourceId): Dataframe 2(ID,可用): 结果数据集应类似于:
下面是我的代码段:
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
时调用resultDF
UDF会抛出一些奇怪的异常。难道我做错了什么?有没有更好/更简单的方法?
假设数据框1代表目标国家,来源国列表,数据框2代表所有国家/地区的可用性,从数据框1中找到所有对,其中目标...