Как объединить (объединить) два SparkDataFrame в SparkR и сохранить один из общих столбцов

у меня есть следующий Spark DataFrame:

aps=data.frame(agent=c('a','b','c','d','a','a','a','b','c','a','b'),product=c('P1','P2','P3','P4','P1','P1','P2','P2','P2','P3','P3'),
      sale_amount=c(1000,2000,3000,4000,1000,1000,2000,2000,2000,3000,3000))

RDD_aps=createDataFrame(sqlContext,agent_product_sale)


   agent product sale_amount
1      a      P1        1000
2      b      P2        2000
3      c      P3        3000
4      d      P4        4000
5      a      P1        1000
6      a      P1        1000
7      a      P2        2000
8      b      P2        2000
9      c      P2        2000
10     a      P3        3000
11     b      P3        3000

и процент = data.frame (агент = c ('a', 'b', 'c'), процент = c (0,2, 0,5, 1,0))

agent  percent
  a      0.2
  b      0.5
  c      1.0

Мне нужно объединить (объединить) два фрейма данных, чтобы я мог иметь процент для каждого агента примерно так:

   agent product sale_amount     percent
1      d      P4        4000          NA
2      c      P3        3000         1.0
3      c      P2        2000         1.0
4      b      P2        2000         0.5
5      b      P2        2000         0.5
6      b      P3        3000         0.5
7      a      P1        1000         0.2
8      a      P1        1000         0.2
9      a      P1        1000         0.2
10     a      P2        2000         0.2
11     a      P3        3000         0.2

Я уже пробовал:

     joined_aps=join(RDD_aps,percent,RDD_aps$agent==percent$agent,"left_outer")

но он добавляет новый второй столбец «агент» из процентного фрейма данных, и мне не нужен дублирующийся столбец.

Я также пробовал:

merged=merge(RDD_aps,percent, by = "agent",all.x=TRUE)

Этот также добавляет столбец «agent_y», но я просто хочу иметь один столбец агента (столбец агента из RDD_aps)


person chessosapiens    schedule 07.09.2016    source источник


Ответы (1)


Я думаю, что видел, как кто-то предотвратил создание переменных «_x» и «_y» с помощью join где-то на SO, но я не могу найти этот пост. Я лично предпочитаю merge в своих операциях... Я думаю, что это проще для меня, плюс мне нравится иметь возможность переключаться между левым/правым/внутренним/внешним/и т. д. соединением, используя аргументы all.x=TRUE/FALSE и all.y=TRUE/FALSE. Я все еще получаю раздражающие (но полезные для проверки) столбцы _x и _y, но я исправляю их с помощью кода, аналогичного приведенному ниже примеру:

df1<- data.frame(person=c("Bob", "Jane", "John", "Liz"), favoriteColor=c("Blue", "Green", "Black", "White"))
df2<- data.frame(person=c("Bob", "Jane", "John", "Liz"), age=c(10,20,30,40))

sdf1<- SparkR::createDataFrame(df1)
sdf2<- SparkR::createDataFrame(df2)

sdf<- SparkR::merge(sdf1, sdf2, by.x="person", by.y="person", all.x=FALSE, all.y=FALSE) # Inner join...all.x/y not needed
colnames(sdf) # person_x and person_y are now present...to be fixed here

colnames(sdf)<- gsub(pattern= "_x",replacement = "", colnames(sdf))

col_names_sdf_subset<- colnames(sdf)[!(colnames(sdf) %in% colnames(sdf)[grep("_y", colnames(sdf))])]

sdf<- sdf %>% SparkR::select(col_names_sdf_subset) 

colnames(sdf)
View(head(sdf, num=20L))
person nate    schedule 05.04.2018