配置单元中的错误:基本错误:org.apache.hadoop.hive.ql.exec.udfargumenttypeexception:需要一个或多个参数

wf82jlnq  于 2021-06-03  发布在  Hadoop
关注(0)|答案(4)|浏览(414)

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

但我在网上找不到任何解决办法。
感谢您的帮助:-)

km0tfn4u

km0tfn4u1#

我也遇到了同样的错误。 rank() 在配置单元中区分大小写,错误消息不会泄露任何信息。尝试改变 RANK()rank() .

mkh04yzy

mkh04yzy2#

我猜这和你的军衔有关系。分析函数可以工作,但在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

要获得正确的结果,必须在内部查询中执行group by,在外部查询中执行分析函数:

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
;

总之,在使用分析函数之前,最好先考虑一下运算顺序,并将处理的数据转换成最简单的形式。

ni65a41a

ni65a41a3#

有趣的是,我今天也犯了同样的错误。我的问题是,我在分析函数中使用的一列不是有效的列。不知道您的表提供了哪些列,我无法证明这是您的问题,但是您可能需要确保您的列组中的所有列都是有效的。

p3rjfoxz

p3rjfoxz4#

在我看来不是有效的“Hive”查询。记住,与sql相比,hive的查询语言非常有限。例如,不支持“in”。(…)上的另一个exmaple rank()-也不支持。换句话说,试图在hive中直接使用rdbms-sql基本上是行不通的。

相关问题