使用 SparkR 连接多个 DataFrame
Joining multiple DataFrames using SparkR
我有一个带有 Person 数据的 DataFrame,还有大约 20 个带有公共键的 DataFrame Person_Id。我想将它们全部加入到 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 连接在一起的更有效方法吗?
非常感谢您的提前帮助。
其他受支持的语言支持简化的等值连接语法,但它似乎未在 R 中实现,因此您必须以旧方式进行(重命名并删除):
library(magrittr)
withColumnRenamed(df_1, "Person_Id", "Person_Id_") %>%
join(df_2, column("Person_Id") == column("Person_id_")) %>%
drop("Person_Id_")
如果您在 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
我有一个带有 Person 数据的 DataFrame,还有大约 20 个带有公共键的 DataFrame Person_Id。我想将它们全部加入到 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 连接在一起的更有效方法吗?
非常感谢您的提前帮助。
其他受支持的语言支持简化的等值连接语法,但它似乎未在 R 中实现,因此您必须以旧方式进行(重命名并删除):
library(magrittr)
withColumnRenamed(df_1, "Person_Id", "Person_Id_") %>%
join(df_2, column("Person_Id") == column("Person_id_")) %>%
drop("Person_Id_")
如果您在 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