【发布时间】:2020-07-03 10:51:13
【问题描述】:
假设数据框 1 代表目标国家和来源国家列表,数据框 2 代表所有国家的可用性,从数据框 1 中找到目标国家映射为 TRUE 和来源的所有对国家/地区映射是FALSE:
数据框 1(targetId、sourceId):
美国:中国、俄罗斯、印度、日本
中国:美国、俄罗斯、印度
俄罗斯:美国、日本
数据框 2(id,可用):
美国:是的
中国:假
俄罗斯:是的
印度:错误
日本:是的
结果数据集应如下所示:
(美国、中国),
(美国、印度)
我的想法是首先分解数据集 1,创建新数据框(例如 tempDF),向其中添加 2 个新列:targetAvailable、sourceAvailable 最后过滤 targetAvailable = false 和 sourceAvailable = true 以获得所需的结果数据框架。
下面是我的代码的 sn-p:
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" })
在计算 resultDF 时调用 isAvailable UDF 会引发一些奇怪的异常。难道我做错了什么?有没有更好/更简单的方法来做到这一点?
【问题讨论】:
-
嗨 Uday,欢迎来到 SO。你已经尝试了什么?您能否向我们展示您拥有的代码和您当前的问题?它目前看起来不像您遇到的问题,而是您的作业。谢谢!
-
你好@regina_fallangi:感谢您的指出。编辑了描述并添加了我的代码。
-
"在计算 resultDF 时调用 isAvailable UDF 会引发一些奇怪的异常。" -> 你能发布“奇怪的异常”吗?
标签: scala apache-spark apache-spark-sql apache-spark-dataset data-transform