使用SparkR加入多个DataFrame

时间:2018-01-04 09:05:50

标签: r apache-spark join apache-spark-sql sparkr

我有一个带有Person数据的DataFrame,还有20个带有公共密钥 Person_Id 的DataFrame。我想将所有这些内容加入Person DataFrame,以便将所有数据放在同一个DataFrame中。

我尝试了这样的加入和合并:

merge(df_person, df_1, by="Person_Id", all.x=TRUE)

join(df_person, df_1, df_person$Person_Id == df_1$Person_Id, "left")

在他们两个中,我发现了同样的错误。这两个函数以正确的方式加入数据集,但它复制字段 Person_Id 。有没有办法告诉这些函数不要复制 Person_Id 字段?

此外,任何人都知道一种更有效的方式将所有这些DataFrame加入到一起吗?

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

其他支持的语言支持简化的equi-join语法,但看起来它没有在R中实现,所以你必须以旧的方式(重命名和删除):

library(magrittr)

withColumnRenamed(df_1, "Person_Id", "Person_Id_") %>% 
  join(df_2, column("Person_Id") == column("Person_id_")) %>% 
  drop("Person_Id_")

答案 1 :(得分:1)

如果你在SparkR中做了很多连接,那么让你自己的函数重命名然后加入然后删除重命名的列是值得的

DFJoin <- function(left_df, right_df, key = "key", join_type = "left"){

    left_df <- withColumnRenamed(left_df, key, "left_key")
    right_df <- withColumnRenamed(right_df, key, "right_key")

    result <- join(
        left_df, right_df,
        left_df$left_key == right_df$right_key,
        joinType = join_type)

    result <- withColumnRenamed(result, "left_key", key)
    result$right_key <- NULL

    return(result)

}

df1 <- as.DataFrame(data.frame(Person_Id = c("1", "2", "3"), value_1 = 
c(2, 4, 6)))
df2 <- as.DataFrame(data.frame(Person_Id = c("1", "2"), value_2 = c(3, 
6)))

df3 <- DFjoin(df1, df2, key = "Person_Id", join_type = "left")
head(df3)
    Person_Id value_1 value_2
1         3       6      NA
2         1       2       3
3         2       4       6