使用group by将Array聚合到Dataframe中

时间:2016-07-22 16:28:16

标签: python apache-spark dataframe apache-spark-sql

我需要在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(values)'由于数据类型不匹配:函数sum需要数字类型,而不是ArrayType(StringType,true);第0行0"

数组始终具有相同的维度。但每次运行维度可能会发生变化,接近100的长度。

如何在不进入RDD的情况下进行聚合?

1 个答案:

答案 0 :(得分: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"))