AFAIK,

Hive supports subqueries only in the FROM clause.

Maybe you have to split you query into more queries...

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SubQueries




       Edson Ramiro


On Thu, Jul 25, 2013 at 9:31 AM, Jérôme Verdier
<verdier.jerom...@gmail.com>wrote:

> 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