如何解决从地图范围内的不同数据框中选择特定的行
你好,我是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)
}
我也尝试过map,但是出现如下错误:
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{
解决方法
一种可能的方法是在每个数据框列后面附加一个键,以唯一地标识列,最后使用country列将所有数据框合并到单个数据框。可以对合并的数据场的每一行执行所需的操作。
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|
+--------+------------+------------+------------+------------+------------+------------+------------+------------+------------+
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。