如何根据另一个数据集中的值有效地映射一个数据集中的键

问题描述 投票:0回答:1

假设数据框1代表目标国家,来源国列表,数据框2代表所有国家/地区的可用性,从数据框1中找到所有对,其中目标国家/地区映射为TRUE,源国家/地区映射为< [FALSE ::>

Dataframe 1(targetId,sourceId):

美国:中国,俄罗斯,印度,日本中国:美国,俄罗斯,印度俄罗斯:美国,日本

Dataframe 2(ID,可用):

美国:是的中国:错误俄罗斯:是的印度:错误日本: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时调用resultDF UDF会抛出一些奇怪的异常。难道我做错了什么?有没有更好/更简单的方法?

假设数据框1代表目标国家,来源国列表,数据框2代表所有国家/地区的可用性,从数据框1中找到所有对,其中目标...

scala apache-spark apache-spark-sql apache-spark-dataset data-transform
1个回答
0
投票
在UDF中,您正在引用另一个数据框,这是不可能的,因此将获得“奇怪”异常。
© www.soinside.com 2019 - 2024. All rights reserved.