Как добавить серийный номер для каждой группы в Spark DataFrame - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь добавить в мой 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. Дополнительно: Предупреждающее сообщение: In 1: n (): NA введены с помощью принуждения

1 Ответ

0 голосов
/ 04 июня 2018

Вы можете использовать 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

Если применять этот способ, порядок значений в группебудет недетерминированным.

...