scala - 从地图范围内的不同数据框中选择特定行
问题描述
您好,我是 Spark 和 scala 的新手,我有以下三个类似的数据框:
df1:
+--------+-------+-------+-------+
| Country|1/22/20|1/23/20|1/24/20|
+--------+-------+-------+-------+
| Chad| 1| 0| 5|
+--------+-------+-------+-------+
|Paraguay| 4| 6| 3|
+--------+-------+-------+-------+
| Russia| 0| 0| 1|
+--------+-------+-------+-------+
df2 and d3 are exactly similar just with different values
我想对 df1 的每一行应用一个函数,但我还需要从其他两个数据框中选择同一行(使用 Country 作为键),因为我需要选择的行作为我想要应用的函数的输入参数。我想过使用
df1.map{ r =>
val selectedRowDf2 = selectRow using r at column "Country" ...
val selectedRowDf3 = selectRow using r at column "Country" ...
r.apply(functionToApply(r, selectedRowDf2, selectedRowDf3)
}
我也尝试过使用地图,但出现如下错误:
Error:(238, 23) not enough arguments for method map: (implicit evidence$6: org.apache.spark.sql.Encoder[Unit])org.apache.spark.sql.Dataset[Unit].
Unspecified value parameter evidence$6.
df1.map{
解决方案
一种可能的方法是为每个数据框列附加一个键以唯一标识列,最后使用国家列将所有数据框合并到单个数据框。可以在合并数据场的每一行上执行所需的操作。
def appendColWithKey(df: DataFrame, key: String) = {
var newdf = df
df.schema.foreach(s => {
newdf = newdf.withColumnRenamed(s.name, s"$key${s.name}")
})
newdf
}
val kdf1 = appendColWithKey(df1, "key1_")
val kdf2 = appendColWithKey(df2, "key2_")
val kdf3 = appendColWithKey(df3, "key3_")
val tempdf1 = kdf1.join(kdf2, col("key1_country") === col("key2_country"))
val tempdf = tempdf1.join(kdf3, col("key1_country") === col("key3_country"))
val finaldf = tempdf
.drop("key2_country")
.drop("key3_country")
.withColumnRenamed("key1_country", "country")
finaldf.show(10)
//Output
+--------+------------+------------+------------+------------+------------+------------+------------+------------+------------+
| country|key1_1/22/20|key1_1/23/20|key1_1/24/20|key2_1/22/20|key2_1/23/20|key2_1/24/20|key3_1/22/20|key3_1/23/20|key3_1/24/20|
+--------+------------+------------+------------+------------+------------+------------+------------+------------+------------+
| Chad| 1| 0| 5| 1| 0| 5| 1| 0| 5|
|Paraguay| 4| 6| 3| 4| 6| 3| 4| 6| 3|
| Russia| 0| 0| 1| 0| 0| 1| 0| 0| 1|
+--------+------------+------------+------------+------------+------------+------------+------------+------------+------------+
推荐阅读
- aws-codecommit - 多账户代码提交设置 aws
- angular - 如何在角度 5 的嵌套 json 数组中发布值?
- python - Tkinter Python OOP:使用 canvas.move() 一次移动单独的小部件
- ssl - IIS 8 基于 URL 地址重定向到 HTTPS
- java - 在等待 Swing 对话框结果时阻塞 JavaFX
- php - 从输入表单到 C 源代码,检查不允许的关键字
- nlp - 查询映射到 NLIDB 系统中的数据库
- ruby-on-rails - 如何在 AWS lightsail 中无错误地在 Rails DB 上创建 ruby
- css - Adblock plus:如何反转 :-abp-has() 选择器?
- node.js - 无法使用 express-fileupload 上传文件