【发布时间】:2020-03-20 23:36:24
【问题描述】:
所以我有一个如下所示的数据框,它已存储为名为 mean_value_gn5 的临时视图,以便我可以在需要获取数据时使用 sql() 进行查询。
+-------+----+
|Species|Avgs|
+-------+----+
| NO2| 43|
| NOX| 90|
| NO| 31|
+-------+----+
此数据框存储使用ceil() 函数四舍五入到最接近整数的“物种”的分类平均值。我需要使用这些分类平均值来估算我感兴趣的数据框clean_gn5 中列Value 的缺失值。我创建了一个新列 Value_imp,它将保存我的最后一列与估算值。
我尝试这样做:
clean_gn5 = clean_gn5.withColumn("Value_imp",
when($"Value".isNull, sql("Select Avgs from mean_value_gn5 where Species = "+$"Species").select("Avgs").head().getLong(0).toInt)
.otherwise($"Value"))
上述代码运行,但值被错误地估算,即对于包含 Species 为 NO 的行,估算值是 43 而不是 31。
在执行此操作之前,我首先检查是否能够通过执行以下操作正确获取值:
println(sql("Select Avgs from mean_value_gn5 where Species = 'NO'").select("Avgs").head().getLong(0))
在对Species 进行硬编码后,我能够正确获取该值,并且根据我的理解,$"Species" 应该可以帮助我获取与该特定行的Species 列对应的值。
我还认为我可能错过了硬编码Species 值周围的单引号,即'NO'。所以我尝试执行以下操作
clean_gn5 = clean_gn5.withColumn("Value_imp",
when($"Value".isNull, sql("Select Avgs from mean_value_gn5 where Species = '"+$"Species"+"'").select("Avgs").head().getLong(0).toInt)
.otherwise($"Value"))
但这导致了以下异常。
Exception in thread "main" java.util.NoSuchElementException: next on empty iterator
我对 Spark 和 Scala 还很陌生。
【问题讨论】:
标签: scala apache-spark