2016-07-22 2 views
0

Мне нужно собрать массив внутри моего фрейма.Агрегатный массив в DataFrame с группой по

dataframe был создан таким образом

splitted.map(lambda x: Row(store= int(x[0]), date= parser.parse(x[1]), values= (x[2:(len(x))])) ) 

Значение является массивом

Я хочу сделать думать, как этот

mean_by_week = sqlct.sql("SELECT store, SUM(values) from sells group by date, store") 

Но у меня есть следующее сообщение об ошибке

AnalysisException: u «не может разрешить« сумму (значения) »из-за несоответствия типа данных: функция sum требует числовых типов, а не ArrayType (StringType, true); линия 0 поз 0"

Массив всегда один и тот же размер. Но при каждом запуске размер может измениться, находится вблизи 100 длины.

Как можно агрегировать не заходя к РДД-х?

ответ

0

Соответствующие размеры или не сумма для array<> не имеет смысла, следовательно, не реализована. Вы можете попробовать провести реструктуризацию и агрегирование:

from pyspark.sql.functions import col, array, size, sum as sum_ 

n = df.select(size("values")).first()[0] 
df = sc.parallelize([(1, [1, 2, 3]), (1, [4, 5, 6])]).toDF(["store", "values"]) 
df.groupBy("store").agg(array(*[ 
    sum_(col("values").getItem(i)) for i in range(n)]).alias("values")) 
Смежные вопросы