2017-02-21 6 views
0

У меня есть dataframe, с столбцом c1, c2. Я хочу, чтобы сгруппировать их по c1 и хочу выбрать с2, что значение c2 содержит шаблон, если все c2 не содержат шаблон возвращать никомуDataframe GroupBy агрегируется в столбце, который содержит шаблон

примера ДФ:

c1 c2 
1 ai_za 
1 ah_px 
1 ag_po 
1 af_io 
1 ae_aa 
1 ad_iq 
1 ac_on 
1 ab_eh 
1 aa_bs 
2 aa_ab 
2 aa_ac 

если шаблон необходимы с2 '_io'

ожидаемый результат:

c1 c2 
1 af_io 
2 aa_ab 

1 af_io возвращается как он содержит '_io' шаблон

2 aa_ab возвращается как случайное, как никто в группе 2 содержит шаблон «_io»

Как получить это с помощью искры dataframe/набора данных API?

+0

Вы хотите выбрать все строки, если их несколько, содержит шаблон '_io'? – Psidom

+0

, если их несколько, содержит шаблон '_io', выберите первую строку –

ответ

1

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

df.groupByKey(_.getAs[Int]("c1")). 
    reduceGroups((x, y) => if(x.getAs[String]("c2").matches(".*_io")) x else y). 
    toDF("key", "value"). 
    select("value.c1", "value.c2").show 

+---+-----+ 

| c1| c2| 
+---+-----+ 
| 1|af_io| 
| 2|aa_ac| 
+---+-----+ 

Примечание: это выбирает первую строку, которая соответствует шаблону и выбирает последнюю строку в группе если нет совпадения.

+1

Спасибо большое @Psidom –

Смежные вопросы