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

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】:

认为你想要的是structexpr函数将两列合二为一并用它来cube上。

struct 如下:

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

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

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

但我只是猜测...

【讨论】:

以上是关于如何在两列上立方体,就好像它们是一列一样?的主要内容,如果未能解决你的问题,请参考以下文章

在两列上检查唯一性的有效方法?

如何使用 UCanAccess 在两列上创建具有唯一约束的表?

模式构建器 laravel 迁移在两列上是唯一的

SQLalchemy:在两列上连接一个表

MySQL在两列上左连接

在两列上创建约束以支持特定规则