Hive:更简洁的 SELECT AS 和 GROUP BY 方式
Hive: More clean way to SELECT AS and GROUP BY
我试着这样写 Hive Sql
SELECT count(1), substr(date, 1, 4) as year
FROM ***
GROUP BY year
但是 Hive 无法识别别名 'year',它会抱怨:
失败:SemanticException [错误 10004]:行 1:79 无效 table 别名或列引用 'year'
一个方案(Hive: SELECT AS and GROUP BY)建议使用'GROUP BY substr(date, 1, 4)'.
有效!
但是在某些情况下我想要分组的值可能是由多行hive函数代码生成的,这样写代码非常难看
SELECT count(1), func1(func2(..........................)) AS something
FROM ***
GROUP BY func1(func2(..........................))
在 Hive 中有什么干净的方法可以做到这一点吗?有什么建议吗?
想到的一个解决方案是 GROUP BY
到外部查询:
SELECT count(*) , year FROM
(
SELECT substr(date, 1, 4) as year FORM ***
) inner
GROUP BY year
GL!
在Hive 0.11.0及以后的版本中,如果hive.groupby.orderby.position.alias设置为true(默认为false),则可以按位置指定列。
因此,在您的 .hql 中设置 set hive.groupby.orderby.position.alias=true;
(或永久解决方案的 .hiverc)就可以解决问题,然后您可以为上面的示例键入 group by 2
。
资料来源:hive language manual
指定分组依据中的位置将解决您的问题。即使在 SET hive.groupby.orderby.position.alias=false; 时,Group By 中的此位置编号也有效
(配置单元 0.12)
SELECT count(1), substr(date, 1, 4) as year
FROM ***
GROUP BY 2;
我试着这样写 Hive Sql
SELECT count(1), substr(date, 1, 4) as year
FROM ***
GROUP BY year
但是 Hive 无法识别别名 'year',它会抱怨: 失败:SemanticException [错误 10004]:行 1:79 无效 table 别名或列引用 'year'
一个方案(Hive: SELECT AS and GROUP BY)建议使用'GROUP BY substr(date, 1, 4)'.
有效! 但是在某些情况下我想要分组的值可能是由多行hive函数代码生成的,这样写代码非常难看
SELECT count(1), func1(func2(..........................)) AS something
FROM ***
GROUP BY func1(func2(..........................))
在 Hive 中有什么干净的方法可以做到这一点吗?有什么建议吗?
想到的一个解决方案是 GROUP BY
到外部查询:
SELECT count(*) , year FROM
(
SELECT substr(date, 1, 4) as year FORM ***
) inner
GROUP BY year
GL!
在Hive 0.11.0及以后的版本中,如果hive.groupby.orderby.position.alias设置为true(默认为false),则可以按位置指定列。
因此,在您的 .hql 中设置 set hive.groupby.orderby.position.alias=true;
(或永久解决方案的 .hiverc)就可以解决问题,然后您可以为上面的示例键入 group by 2
。
资料来源:hive language manual
指定分组依据中的位置将解决您的问题。即使在 SET hive.groupby.orderby.position.alias=false; 时,Group By 中的此位置编号也有效 (配置单元 0.12)
SELECT count(1), substr(date, 1, 4) as year
FROM ***
GROUP BY 2;