我正在尝试在hive中翻译一些pl/sql脚本,但是在一个hiveql脚本中遇到了一个错误。
错误是这样的:
FAILED: SemanticException Failed to breakup Windowing invocations into Groups. At least 1 group must only depend on input columns. Also check for circular dependencies.
Underlying error: org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException: One or more arguments are expected.
我认为错误来自脚本的这一部分:
SELECT
mag.co_magasin,
dem.id_produit as id_produit_orig,
pnvente.dt_debut_commercial as dt_debut_commercial,
COALESCE(pnvente.id_produit,dem.id_produit) as id_produit,
min(
CASE WHEN dem.co_validation IS NULL THEN 0 ELSE 1 END
) as flg_demarque_valide,
sum(CASE WHEN dem.co_validation IS NULL THEN 0 ELSE cast(dem.mt_revient_ope AS INT) END)
as me_dem_con_prx_cs,
0 as me_dem_inc_prx_cs,
0 as me_dem_prov_stk_cs,
sum(CASE WHEN dem.co_validation IS NULL THEN 0 ELSE cast(dem.qt_demarque AS INT) END)
as qt_dem_con,
0 as qt_dem_inc,
0 as qt_dem_prov_stk,
RANK() OVER (PARTITION BY mag.co_magasin, dem.id_produit ORDER BY pnvente.dt_debut_commercial DESC, COALESCE(pnvente.id_produit,dem.id_produit) DESC) as rang
from default.calendrier cal
INNER JOIN default.demarque_mag_jour dem
ON CASE WHEN dem.co_societe = 1 THEN 1 ELSE 2 END = '${hiveconf:in_co_societe}'
AND dem.dt_jour = cal.dt_jour
LEFT OUTER JOIN default.produit_norm pn
ON pn.co_societe = dem.co_societe
AND pn.id_produit = dem.id_produit
LEFT OUTER JOIN default.produit_norm pnvente
ON pnvente.co_societe = pn.co_societe
AND pnvente.co_produit_rfu = pn.co_produit_lip
AND pnvente.co_type_motif='05'
INNER JOIN default.kpi_magasin mag
ON mag.co_societe = '${hiveconf:in_co_societe}'
AND mag.id_magasin = dem.id_magasin
WHERE cal.dt_jour = '${hiveconf:in_dt_jour}'
AND NOT (dem.co_validation IS NULL AND cal.dt_jour > from_unixtime(unix_timestamp()-3*60*60*24, 'ddmmyyyy'))
-- JYP 4.4
AND dem.co_operation_magasin IN ('13','14','32')
GROUP BY
mag.co_magasin,
dem.id_produit,
pnvente.dt_debut_commercial,
COALESCE(pnvente.id_produit,dem.id_produit)
但我在网上找不到任何解决办法。
感谢您的帮助:-)
4条答案
按热度按时间km0tfn4u1#
我也遇到了同样的错误。
rank()
在配置单元中区分大小写,错误消息不会泄露任何信息。尝试改变RANK()
至rank()
.mkh04yzy2#
我猜这和你的军衔有关系。分析函数可以工作,但在hiveql中受到更大的限制。我会在一个内部查询中尝试所有的连接和求和,然后在一个外部查询中进行排名。通常情况下,这是必需的,因为hiveql并不总是遵循与典型sql语言相同的操作顺序。考虑一个基于股票信息的表格:
现在考虑以下查询:
您将期望得到以下结果:
但实际上在hiveql中会得到:
要获得正确的结果,必须在内部查询中执行group by,在外部查询中执行分析函数:
总之,在使用分析函数之前,最好先考虑一下运算顺序,并将处理的数据转换成最简单的形式。
ni65a41a3#
有趣的是,我今天也犯了同样的错误。我的问题是,我在分析函数中使用的一列不是有效的列。不知道您的表提供了哪些列,我无法证明这是您的问题,但是您可能需要确保您的列组中的所有列都是有效的。
p3rjfoxz4#
在我看来不是有效的“Hive”查询。记住,与sql相比,hive的查询语言非常有限。例如,不支持“in”。(…)上的另一个exmaple rank()-也不支持。换句话说,试图在hive中直接使用rdbms-sql基本上是行不通的。