2015-12-22 3 views
12

, когда я использую DataFrame GroupBy так:Как получить другие столбцы при использовании Spark DataFrame groupby?

df.groupBy(df("age")).agg(Map("id"->"count")) 

Я только получить DataFrame с колоннами «возраст» и «счета (ID)», но в ФР, есть много других столбцов, как «имя».

В целом, я хочу, чтобы получить результат, как в MySQL,

«выберите имя, возраст, граф (идентификатор) из ДФ группы по возрасту»

Что я должен делать, когда использовать groupby в Spark?

+0

Почему бы не использовать «выбрать имя, возраст, счет (id) из группы df по возрасту, имя«? », Только« группа по возрасту »выберет много разных имен, но отобразит только одно имя – taigetco

+0

В моем вопросе я просто дайте простой пример. При использовании «group by age, name», он получит другой результат с «группой по возрасту», по-видимому .... – Psychevic

ответ

11

Короче говоря, вы должны объединить результаты с исходной таблицей. Spark SQL следует тому же пред-SQL: 1999 как большинство основных баз данных (PostgreSQL, Oracle, MS SQL Server), который не позволяет добавлять дополнительные столбцы в запросы агрегации.

Поскольку для таких агрегатов, как результаты подсчета, не определены четко, и поведение, как правило, меняется в системах, поддерживающих этот тип запросов, можно просто добавить дополнительные столбцы, используя произвольный агрегат, например first или last.

В некоторых случаях вы можете заменить agg с помощью select с функциями окна и последующим where, но в зависимости от контекста это может быть довольно дорого.

+0

Хорошо ... плач – Psychevic

-2

Вы можете сделать так:

Образец данных:

name age id 
abc  24 1001 
cde  24 1002 
efg  22 1003 
ghi  21 1004 
ijk  20 1005 
klm  19 1006 
mno  18 1007 
pqr  18 1008 
rst  26 1009 
tuv  27 1010 
pqr  18 1012 
rst  28 1013 
tuv  29 1011 
df.select("name","age","id").groupBy("name","age").count().show(); 

Выход:

+----+---+-----+ 
    |name|age|count| 
    +----+---+-----+ 
    | efg| 22| 1| 
    | tuv| 29| 1| 
    | rst| 28| 1| 
    | klm| 19| 1| 
    | pqr| 18| 2| 
    | cde| 24| 1| 
    | tuv| 27| 1| 
    | ijk| 20| 1| 
    | abc| 24| 1| 
    | mno| 18| 1| 
    | ghi| 21| 1| 
    | rst| 26| 1| 
    +----+---+-----+ 
4

Один из способов получить все столбцы после выполнения GroupBy - использовать функции соединения на.

feature_group = ['name', 'age'] 
data_counts = df.groupBy(feature_group).count().alias("counts") 
data_joined = df.join(data_counts, feature_group) 

data_joined теперь будет иметь все столбцы, включая значения count.

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