如何修改Spark数据框中的部分列

时间:2018-01-19 10:00:02

标签: r apache-spark dplyr sparklyr mutate

我正在尝试从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是一个生活在R的数据表。

知道我做错了什么,或者应该如何做好?

1 个答案:

答案 0 :(得分:1)

让我们说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_joincoalesce

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除外。