如何把两列当作一列来处理



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

'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)中。

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

对于struct,它将如下:

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

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

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

但我只是猜测

相关内容

  • 没有找到相关文章