如何在两列上立方体就像它们一样?

时间:2016-11-08 13:55:40

标签: apache-spark apache-spark-sql

我有以下属性,我对在属性上执行聚合(例如常规计数)感兴趣:

'category', 'sub-category', age, city, education... (around 10 more)

我对group by中属性的所有可能组合感兴趣,因此使用数据框 cube 函数可以帮助我实现这一目标。

但是这里有一个问题:子类别没有类别没有任何意义,所以为了实现这一点,我需要结合汇总(类别,子类别)与立方体(年龄,城市,教育......)。

怎么做?

这就是我尝试过的,其中 test 是我的表名:

val data = sqlContext.sql("select category,'sub-category',age from test group by cube(rollup(category,'sub-category'), age )")

这是我得到的错误:

  

org.apache.spark.sql.AnalysisException:表达式'test。category'既不存在于组中,也不是聚合函数。如果你不关心你获得哪个值,请添加到group by或wrap in first()(或first_value)。

1 个答案:

答案 0 :(得分:0)

认为你想要的是structexpr个函数,将两列合并为一个,并将其用于cube

使用struct,如下所示:

df.rollup(struct("category", "sub-category") as "(cat,sub)")

使用expr就像使用"纯"一样简单SQL,即

df.rollup(expr("(category, 'sub-category')") as "(cat,sub)")

但我只是猜测 ...