如何修改 Spark 数据框中的部分列
How do I modify part of a column in a Spark data frame
我正在尝试修改 Spark 数据框中的部分列。行选择基于向量(在 R env 中)ID.X
。替换是另一个向量(在 R env 中)Role
。
我尝试了以下方法:
> sdf.bigset %>% filter(`_id` %in% ID.X) %>%
mutate(data_role= Role )
它让我的 R
崩溃了
以及以下
> head(DT.XSamples)
_id Role
1: 5996e9e12a2aa6315127ed0e Training
2: 5996e9e12a2aa6315127ed0f Training
3: 5996e9e12a2aa6315127ed10 Training
> setkey(DT.XSamples,`_id`)
> Lookup.XyDaRo <- function(x){
unlist(DT.XSamples[x,Role])
}
> sdf.bigset %>% filter(`_id` %in% ID.X) %>% rowwise()%>%
mutate(data_role= Lookup.XyDaRo(`_id`) )
以及以下
> Fn.lookup.XyDaRo <- function(id,role){
ifelse(is.na(role), unlist(DT.XSamples[id,Role] ), role )
}
> sdf.bigset%>% rowwise() %>%
mutate(data_role= Fn.lookup.XyDaRo(`_id`,data_role))
然后我得到两种情况
Error: is.data.frame(data) is not TRUE
sdf.bigset
是一个 Spark 数据框。
DT.XSamples
是一个数据 table 存在于 R.
知道我做错了什么,或者应该如何正确完成吗?
假设 sdf.bigset
看起来像这样:
sdf.bigset <- copy_to(sc, data.frame(`id` = 1:10, data_role = "Unknown"))
adn DT.XSamples
定义为:
XSamples <- data.frame(
`id` = c(3, 5, 9), role = c("Training", "Dev", "Secret")
)
将 DT.XSamples
转换为 Spark:
sdf.XSamples <- copy_to(sc, XSamples)
left_join
和 coalesce
:
left_join(sdf.bigset, sdf.XSamples, by="id") %>%
mutate(data_role = coalesce(role, data_role))
# Source: lazy query [?? x 3]
# Database: spark_connection
id data_role role
<int> <chr> <chr>
1 1 Unknown NA
2 2 Unknown NA
3 3 Training Training
4 4 Unknown NA
5 5 Dev Dev
6 6 Unknown NA
7 7 Unknown NA
8 8 Unknown NA
9 9 Secret Secret
10 10 Unknown NA
最终放弃负 select
的角色。
关于您的代码:
- 向量替换将不起作用,因为 Spark
DataFrame
更像是关系(在关系代数意义上)而不是 DataFrame
,并且一般顺序未定义,因此不会实现这样的操作。
- DT 变体将无法工作,因为您无法执行纯 R 代码,除了(非常低效)
spark_apply
.
我正在尝试修改 Spark 数据框中的部分列。行选择基于向量(在 R env 中)ID.X
。替换是另一个向量(在 R env 中)Role
。
我尝试了以下方法:
> sdf.bigset %>% filter(`_id` %in% ID.X) %>%
mutate(data_role= Role )
它让我的 R
崩溃了以及以下
> head(DT.XSamples)
_id Role
1: 5996e9e12a2aa6315127ed0e Training
2: 5996e9e12a2aa6315127ed0f Training
3: 5996e9e12a2aa6315127ed10 Training
> setkey(DT.XSamples,`_id`)
> Lookup.XyDaRo <- function(x){
unlist(DT.XSamples[x,Role])
}
> sdf.bigset %>% filter(`_id` %in% ID.X) %>% rowwise()%>%
mutate(data_role= Lookup.XyDaRo(`_id`) )
以及以下
> Fn.lookup.XyDaRo <- function(id,role){
ifelse(is.na(role), unlist(DT.XSamples[id,Role] ), role )
}
> sdf.bigset%>% rowwise() %>%
mutate(data_role= Fn.lookup.XyDaRo(`_id`,data_role))
然后我得到两种情况
Error: is.data.frame(data) is not TRUE
sdf.bigset
是一个 Spark 数据框。
DT.XSamples
是一个数据 table 存在于 R.
知道我做错了什么,或者应该如何正确完成吗?
假设 sdf.bigset
看起来像这样:
sdf.bigset <- copy_to(sc, data.frame(`id` = 1:10, data_role = "Unknown"))
adn DT.XSamples
定义为:
XSamples <- data.frame(
`id` = c(3, 5, 9), role = c("Training", "Dev", "Secret")
)
将 DT.XSamples
转换为 Spark:
sdf.XSamples <- copy_to(sc, XSamples)
left_join
和 coalesce
:
left_join(sdf.bigset, sdf.XSamples, by="id") %>%
mutate(data_role = coalesce(role, data_role))
# Source: lazy query [?? x 3]
# Database: spark_connection
id data_role role
<int> <chr> <chr>
1 1 Unknown NA
2 2 Unknown NA
3 3 Training Training
4 4 Unknown NA
5 5 Dev Dev
6 6 Unknown NA
7 7 Unknown NA
8 8 Unknown NA
9 9 Secret Secret
10 10 Unknown NA
最终放弃负 select
的角色。
关于您的代码:
- 向量替换将不起作用,因为 Spark
DataFrame
更像是关系(在关系代数意义上)而不是DataFrame
,并且一般顺序未定义,因此不会实现这样的操作。 - DT 变体将无法工作,因为您无法执行纯 R 代码,除了(非常低效)
spark_apply
.