SparkSQL:在GROUP BY中使用自定义列

时间:2016-02-24 18:25:59

标签: sql apache-spark apache-spark-sql spark-streaming spark-dataframe

我正在使用Spark 1.3.0。在我的应用程序中,我创建了一个包含columns (col1, col2, col3,col4)的数据框

我必须在数据框中派生自定义列(新列)。 所以我的SQL查询看起来像

SELECT (col1 + col1/10) as col1 , col2, col3 , col4 FROM table GROUP BY col1 , col2

我要求按新的自定义列进行分组,而不是旧的col1。但上面的查询无法正常工作。它仍然由旧col1分组。我知道我给新的自定义列赋予了与旧列名相同的名称。即使尝试为自定义列赋予新名称,如:

SELECT (col1 + col1/10) as new_col1 , col2, col3 , col4 FROM table GROUP BY new_col1 , col2

失败并出现以下错误:

org.apache.spark.sql.AnalysisException: cannot resolve 'new_col1' given input columns..

有任何建议如何实现这一目标? 感谢

1 个答案:

答案 0 :(得分:4)

假设剩下的部分是有效的聚合,您可以使用子查询:

SELECT  new_col1 AS col1, sum(col2), sum(col3), sum(col4)
FROM (
    SELECT *, col1 + col1 / 10 AS new_col1 FROM table
) AS tmp GROUP BY new_col1, col2

或在group by子句中重复该公式。

SELECT (col1 + col1/10) as col1 , sum(col2), sum(col3), sum(col4)
FROM table
GROUP BY (col1 + col1 / 10), col2

请注意,第一个选项需要计算列的明确别名。