如何在Spark DataFrame中为每个组添加序列号

时间:2018-06-04 08:25:06

标签: r apache-spark dplyr apache-spark-sql sparklyr

我正在尝试使用基于条件的序列号向我的Spark DataFrame添加一列:我想为其中一列中的每个组分配顺序整数。

我尝试了很多方法,但似乎没有任何工作。

df<-data.frame(location=c("a","a","d","d","d"),
               device_id=c(123,3455,234,4565,675),
               expected_column=c(1,2,1,2,3))

#final_data_visitor is my spark Data Frame 
random_data<-final_data_visitor

random_data<-random_data %>%
       group_by(location_id,device_subscriber_id)%>%                
       mutate(visit_seq=1:n())

random_data
# error is "Error in from:to : NA/NaN argument
In addition: Warning message:
In 1:n() : NAs introduced by coercion"

这是我尝试执行代码时遇到的错误:

  

“from:to:NA / NaN参数出错   另外:警告信息:   在1:n():由强制引入的NA

1 个答案:

答案 0 :(得分:1)

您可以使用row_number窗口功能,但为了能够应用它,您需要某种形式的订购。例如,如果数据定义如下

set.seed(1)
df <- copy_to(sc, tibble(group=rep(c("a", "b"), 3), value=runif(6)))

你可以

df %>% 
  group_by(group) %>% 
  arrange(value, .by_group=TRUE) %>%  
  mutate(r = row_number())
# Source:     lazy query [?? x 3]
# Database:   spark_connection
# Groups:     group
# Ordered by: value, TRUE
  group value     r
  <chr> <dbl> <int>
1 b     0.372     1
2 b     0.898     2
3 b     0.908     3
4 a     0.202     1
5 a     0.266     2
6 a     0.573     3

如果没有预定义的排序,您可以尝试使用montonically_increasing_id添加一个(请确保您首先了解Spark的排序语义),或者,如果您不关心用于分组的相同列的顺序:

df %>% 
  group_by(group) %>% 
  arrange(group, .by_group=TRUE) %>%
  mutate(r = row_number())
# Source:     lazy query [?? x 3]
# Database:   spark_connection
# Groups:     group
# Ordered by: group, TRUE
  group value     r
  <chr> <dbl> <int>
1 a     0.266     1
2 a     0.573     2
3 a     0.202     3
4 b     0.372     1
5 b     0.908     2
6 b     0.898     3

如果以这种方式应用,组中值的顺序将是不确定的。