scala—从Map范围内的不同Dataframe中选择特定行

efzxgjgh  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(453)

你好,我是spark和scala的新手,我有三个类似的Dataframe,如下所示:

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的每一行应用一个函数,但我还需要从其他两个Dataframe中选择同一行(使用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{
i7uaboj4

i7uaboj41#

一种可能的方法是在每个dataframe列后面附加一个键来唯一地标识这些列,最后使用country列将所有dataframe合并到一个dataframe中。可以对合并数据场的每一行执行所需的操作。

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|
+--------+------------+------------+------------+------------+------------+------------+------------+------------+------------+

相关问题