我对以下属性执行聚合(例如常规计数)感兴趣:
'category', 'sub-category', age, city, education... (around 10 more)
我对group by中所有可能的属性组合感兴趣,因此使用dataframes cube函数可以帮助我实现这一目标。
但是这里有一个问题:如果没有类别, 子类别就没有任何意义,所以为了实现这一点,我需要将rollup(类别,子类别)与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
'既不存在于群by中,也不是一个聚合函数。如果你不关心得到的是哪个值,可以添加到group by或wrap in first()(或first_value)中。
我认为您想要的是struct
或expr
函数将两列合并为一,并将其用于cube
上。
对于struct
,它将如下:
df.rollup(struct("category", "sub-category") as "(cat,sub)")
对于expr
,它就像使用"纯"SQL一样简单,即
df.rollup(expr("(category, 'sub-category')") as "(cat,sub)")
但我只是猜测…