Hive错误:基础错误:org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException:预期有一个或多个参数

时间:2013-07-01 09:43:32

标签: sql hadoop plsql hive hiveql

我正在尝试在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 个答案:

答案 0 :(得分:4)

我遇到了同样的错误。 rank()在配置单元中区分大小写,错误消息不会给出任何消息。尝试将RANK()更改为rank()

答案 1 :(得分: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
;

总而言之,在使用分析函数并在使用分析函数之前将使用的数据转换为最简单的形式时,最好考虑操作顺序。

答案 2 :(得分:1)

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

答案 3 :(得分:-4)

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