Hi Bennie,

I was trying some solutions to pass through my problem, and a problem occurs

here is the error :

FAILED: ParseException line 26:14 cannot recognize input near 'SELECT'
'cal' '.' in expression specification

Is AND...BETWEEN ( SELECT..... is possible in Hive?


2013/7/25 Bennie Schut <bsc...@ebuddy.com>

>  Hi Jerome,
>
> Yes it looks like you could stop using GET_SEMAINE  and directly joining
> "calendrier_hebdo" with "calendrier" for example. For "FCALC_IDJOUR" you
> will have to make a udf so I hope you have some java skills :)
> The "calendrier" tables suggests you have star schema with a calendar
> table. If on oracle you partitioned on a date and use a subquery to get the
> dates you want from the fact table you can expect this to be a problem in
> hive. Partition pruning works during planning it will not know which
> partitioned to prune and thus run on all the data in the fact table and
> filter after it's done making partitioning useless. There are ways of
> working around this, it seems most people decide to use a "deterministic"
> udf which produces the dates and this causes the udfs to be run during
> planning and partition pruning magically works again.
> Hope this helps.
>
> Bennie.
>
> Op 25-7-2013 09:50, Jérôme Verdier schreef:
>
>    Hi,
>
>  I need some help to translate a PL/SQL script in HiveQL.
>
>  Problem : my PL/SQL script is calling two functions.
>
>  you can see the script below :
>
>     SELECT
>       in_co_societe                             as co_societe,
>       'SEMAINE'                                 as co_type_periode,
>       a.type_entite                             as type_entite,
>       a.code_entite                             as code_entite,
>       a.type_rgrp_produits                      as type_rgrp_produits,
>       a.co_rgrp_produits                        as co_rgrp_produits,
>       SUM(a.MT_CA_NET_TTC)                      as MT_CA_NET_TTC,
>       SUM(a.MT_OBJ_CA_NET_TTC)                  as MT_OBJ_CA_NET_TTC,
>       SUM(a.NB_CLIENTS)                         as NB_CLIENTS,
>       SUM(a.MT_CA_NET_TTC_COMP)                 as MT_CA_NET_TTC_COMP,
>       SUM(a.MT_OBJ_CA_NET_TTC_COMP)             as MT_OBJ_CA_NET_TTC_COMP,
>       SUM(a.NB_CLIENTS_COMP)                    as NB_CLIENTS_COMP
>     from
>       kpi.thm_ca_rgrp_produits_jour/*@o_bi.match.eu*/ a
>     WHERE
>         a.co_societe = in_co_societe
>     AND a.dt_jour between
>       (
>         SELECT
>           cal.dt_jour_deb
>         FROM ods.calendrier_hebdo cal
>         WHERE cal.co_societe = in_co_societe
>         AND cal.co_an_semaine = ods.package_date.get_semaine(
>           ods.package_date.fcalc_idjour(
>             CASE
>               WHEN TO_CHAR(D_Dernier_Jour,'YYYY') =
> TO_CHAR(D_Dernier_Jour-364,'YYYY') THEN
>                 NEXT_DAY(D_Dernier_Jour-364,1)-7
>               ELSE
>                 D_Dernier_Jour-364
>             END
>           )
>         )
>       )
>       AND D_Dernier_Jour-364
>     -- On ne calcule rien si la semaine est compl¿¿te
>     AND (
>           TO_CHAR(D_Dernier_Jour,'DDMM') <> '3112'
>       AND TO_CHAR(D_Dernier_Jour,'D') <> '7'
>     )
>     GROUP BY
>       a.type_entite,
>       a.code_entite,
>       a.type_rgrp_produits,
>       a.co_rgrp_produits;
>
>  The function ods.package_date.get_semaine is :
>
> FUNCTION GET_SEMAINE
>        (ID_DEB  IN NUMBER)
>   RETURN NUMBER
>   IS
>     SEMAINE  NUMBER(10);
>   BEGIN
>     SELECT CO_AN_SEMAINE
>     INTO   SEMAINE
>     FROM   CALENDRIER
>     WHERE  ID_JOUR = ID_DEB;
>
>     RETURN (SEMAINE);
>   EXCEPTION
>     WHEN NO_DATA_FOUND THEN
>       RETURN (0);
>     WHEN OTHERS THEN
>       RETURN (0);
>   END;
>
>  The function ods.package_date.fcalc_idjour is below :
>
> FUNCTION FCALC_IDJOUR
>        (DATE_REFERENCE  IN DATE)
>   RETURN NUMBER
>   IS
>     NM_ANNEE        NUMBER := TO_NUMBER(TO_CHAR(DATE_REFERENCE,'YYYY'));
>     NM_MOIS         NUMBER :=
> TO_NUMBER(SUBSTR(TO_CHAR(DATE_REFERENCE,'YYYYMM'),5,2));
>     NM_JOUR         NUMBER :=
> TO_NUMBER(SUBSTR(TO_CHAR(DATE_REFERENCE,'YYYYMMDD'),7,2));
>     IDJOUR_CALCULE  NUMBER := 0;
>   BEGIN
>     IF NM_ANNEE < 1998
>         OR DATE_REFERENCE IS NULL THEN
>       IDJOUR_CALCULE := 0;
>     ELSE
>       IDJOUR_CALCULE := ((NM_ANNEE - 1998) * 600) + ((NM_MOIS - 01) * 50)
> + NM_JOUR;
>     END IF;
>
>     RETURN IDJOUR_CALCULE;
>     DBMS_OUTPUT.PUT_LINE(IDJOUR_CALCULE);
>   END FCALC_IDJOUR;
>
>  Is it possible to translate this in one  HiveQL script ?
>
>
>


-- 
*Jérôme VERDIER*
06.72.19.17.31
verdier.jerom...@gmail.com

Reply via email to