【问题标题】: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 函数,但您没有执行任何操作。我不确定立方体功能。

标签: apache-spark apache-spark-sql


【解决方案1】:

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

struct 如下:

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

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

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

但我只是猜测...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2018-08-25
    相关资源
    最近更新 更多