【发布时间】:2021-12-10 13:07:15
【问题描述】:
假设我有以下两个数据框:
DF1:
+----------+----------+----------+
| Place|Population| IndexA|
+----------+----------+----------+
| A| Int| X_A|
| B| Int| X_B|
| C| Int| X_C|
+----------+----------+----------+
DF2:
+----------+----------+
| City| IndexB|
+----------+----------+
| D| X_D|
| E| X_E|
| F| X_F|
| ....| ....|
| ZZ| X_ZZ|
+----------+----------+
上面的数据框通常要大得多。
我想确定从DF1 到每个Place 到哪个City(DF2) 的最短距离。可以根据索引计算距离。所以对于DF1 中的每一行,我必须遍历DF2 中的每一行,并根据索引的计算寻找最短距离。对于距离计算,定义了一个函数:
val distance = udf(
(indexA: Long, indexB: Long) => {
h3.instance.h3Distance(indexA, indexB)
})
我尝试了以下方法:
val output = DF1.agg(functions.min(distance(col("IndexA"), DF2.col("IndexB"))))
但是这个,代码编译但是我得到以下错误:
线程“主”org.apache.spark.sql.AnalysisException 中的异常:已解决的属性
Places#316,Population#330,IndexAx#338L 中缺少 H3Index#220L 在运算符 !Aggregate
[min(if ((isnull(IndexA#338L) OR isnull(IndexB#220L))) null else UDF(knownnotnull(IndexA#338L), knownnotnull(IndexB#220L))) AS min(UDF(IndexA, IndexB))#346].
所以我想我在从DF1 获取一行时迭代DF2 中的每一行时做错了,但我找不到解决方案。
我做错了什么?我的方向是否正确?
【问题讨论】:
标签: scala dataframe apache-spark apache-spark-sql uber-api