3

我正在尝试在 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

4 回答 4

4

我遇到了同样的错误。rank()在 hive 中区分大小写,并且错误消息不会泄露任何信息。尝试更改RANK()rank().

于 2014-09-24T01:03:51.520 回答
1

我的猜测是,这与你的等级内的合并有关。分析函数可以工作,但在 HiveQL 中受到更多限制。我会在内部查询中尝试所有的连接和求和,然后在外部查询中进行排名。通常这是必需的,因为 HiveQL 并不总是遵循您对典型 SQL 语言所期望的相同操作顺序。考虑一个基于股票信息的表格:

select count(*) as COUNT
from NYSE_STOCKS
where date in ('2001-12-20','2001-12-21','2001-12-24') and exchange = 'NYSE';

现在考虑以下查询:

select 
  exchange
  , date
  , count(*) over (partition by exchange) 
from NYSE_STOCKS 
where date in ('2001-12-20','2001-12-21','2001-12-24') 
group by exchange, date;

您会期望得到以下结果:

EXCHANGE | DATE       | COUNT
NYSE     | 2001-12-20 | 5199
NYSE     | 2001-12-21 | 5199
NYSE     | 2001-12-24 | 5199 

但你实际上会在 HiveQL 中得到这个:

EXCHANGE | DATE       | COUNT
NYSE     | 2001-12-20 | 3
NYSE     | 2001-12-21 | 3
NYSE     | 2001-12-24 | 3

要获得正确的结果,您必须在内部查询中进行分组,在外部查询中使用分析函数:

select 
  exchange
  , date
  , count
from (
  select 
        exchange
        , date
        , count(*) over (partition by exchange) as count
  from NYSE_STOCKS 
  where date in ('2001-12-20','2001-12-21','2001-12-24') 
) A
group by exchange, date, count
;

因此,总而言之,在使用分析函数时考虑操作顺序并在使用分析函数之前将您正在使用的数据获取到最简单的形式总是好的。

于 2013-08-07T05:28:55.253 回答
1

有趣的是,我今天实际上遇到了同样的错误。对我来说,问题是我在分析函数中使用的列之一不是有效列。W/O 知道您的表提供了哪些列,我无法证明这是您的问题,但您可能希望确保 RANK 中的所有列都有效。

于 2013-10-17T19:06:26.513 回答
-4

对我来说,这看起来不像是一个有效的“Hive”查询。请记住,与 SQL 相比,hive 的查询语言非常有限。例如,不支持“IN”。另一个示例 RANK() OVER (...) - 也不支持。换句话说,尝试直接在 Hive 中使用 RDBMS SQL 大多是行不通的。

于 2013-07-03T07:18:57.963 回答