2016-07-11 2 views
0

Мне нужно агрегировать значения столбца articleId в массив. Это нужно сделать в группе, которую я создаю за groupBy заранее.Spark SQL: Совокупные значения столбцов в группе

Моя таблица выглядит следующим образом:

| customerId | articleId | articleText | ... 
| 1  |  1  | ...  | ... 
| 1  |  2  | ...  | ... 
| 2  |  1  | ...  | ... 
| 2  |  2  | ...  | ... 
| 2  |  3  | ...  | ... 

И я хочу, чтобы построить что-то вроде

| customerId | articleIds | 
| 1  | [1, 2]  | 
| 2  | [1, 2, 3] |  

Мой код до сих пор:

DataFrame test = dfFiltered.groupBy("CUSTOMERID").agg(dfFiltered.col("ARTICLEID")); 

Но здесь я получаю AnalysisException:

Exception in thread "main" org.apache.spark.sql.AnalysisException: expression 'ARTICLEID' is neither present in the group by, nor is it an aggregate function. Add to group by or wrap in first() (or first_value) if you don't care which value you get.; 

Может кто-нибудь помочь построить правильное заявление?

+0

ли вам использовать 'SQLContext' или' HiveContext'? –

+0

Я использую SQLContext ... –

ответ

0

Для синтаксиса SQL, когда вы хотите сгруппировать что-то, вы должны включить это «что-то» в оператор select. Возможно, в вашем коде sparkSQL это не указано.

У вас есть подобный вопрос, так что я думаю, что это решение для вашей проблемы SPARK SQL replacement for mysql GROUP_CONCAT aggregate function

0

Это может быть достигнуто с помощью collect_list функции, но она доступна только если вы используете HiveContext:

import org.apache.spark.sql.functions._ 

df.groupBy("customerId").agg(collect_list("articleId")) 
Смежные вопросы