如何在两列上立方体,就好像它们是一列一样?
Posted
技术标签:
【中文标题】如何在两列上立方体,就好像它们是一列一样?【英文标题】:How to cube on two columns as if they were one? 【发布时间】:2016-11-08 13:55:40 【问题描述】:我有兴趣对属性执行聚合(例如常规计数)以下属性:
'category', 'sub-category', age, city, education... (around 10 more)
我对 group by 中所有可能的属性组合感兴趣,因此使用 dataframes cube 函数可以帮助我实现这一点。
但这里有个问题:sub-category 没有 category 就没有任何意义,所以为了实现这一点,我需要结合 rollup(category, sub-类别)与立方体(年龄,城市。教育......)。
如何做到这一点?
这是我尝试过的,其中 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 中,也不是聚合函数。如果您不在乎获得哪个值,请添加到分组依据或包装在 first() (或 first_value)中。;
【问题讨论】:
请通过共享示例数据、您尝试过的代码和预期输出提供可重现的示例。 @Srdjan Nikitovic:您尝试过窗口函数,它可能对您有所帮助吗? @Shankar 我看不出窗口函数如何帮助我解决这个问题...... @SrdjanNikitovic:错误清楚地表明,您需要使用 group by 中的选定属性,或者您应该使用 agg 函数,但您没有执行任何操作。我不确定立方体功能。 【参考方案1】:我认为你想要的是struct
或expr
函数将两列合二为一并用它来cube
上。
struct
如下:
df.rollup(struct("category", "sub-category") as "(cat,sub)")
使用expr
就像使用“纯”SQL 一样简单,即
df.rollup(expr("(category, 'sub-category')") as "(cat,sub)")
但我只是猜测...
【讨论】:
以上是关于如何在两列上立方体,就好像它们是一列一样?的主要内容,如果未能解决你的问题,请参考以下文章