2013-06-25 69 views
1

我试图在HiveQL中翻译不同的PL/SQL脚本。将PL/SQL ETL过程转换为HiveQL

这些differents scrip fts用于ETL过程,用于从不同表格导入数据。

我'试图做同样的事情在Hadoop的/蜂房,使用HiveQL

但是,这个脚本的人给我一些问题。

这里是我的PL/SQL脚本:

BEGIN 

    -- Mise a jour au niveau magasin et famille 
    MERGE INTO KPI.THM_CA_RGRP_PRODUITS_JOUR cible USING (
    SELECT 
     in_co_societe            as CO_SOCIETE, 
     in_dt_jour             as DT_JOUR, 
     'MAG'              as TYPE_ENTITE, 
     m.co_magasin            as CODE_ENTITE, 
     'FAM'              as TYPE_RGRP_PRODUITS, 
     sourceunion.CO_RGRP_PRODUITS        as CO_RGRP_PRODUITS, 
     SUM(MT_CA_NET_TTC)           as MT_CA_NET_TTC, 
     SUM(MT_OBJ_CA_NET_TTC)          as MT_OBJ_CA_NET_TTC, 
     SUM(NB_CLIENTS)            as NB_CLIENTS, 
     SUM(MT_CA_NET_TTC_COMP)          as MT_CA_NET_TTC_COMP, 
     SUM(MT_OBJ_CA_NET_TTC_COMP)         as MT_OBJ_CA_NET_TTC_COMP, 
     SUM(NB_CLIENTS_COMP)          as NB_CLIENTS_COMP 
    FROM (
     -- Mise a jour du CA 
     SELECT 
     mtransf.id_mag_transfere    as ID_MAGASIN, 
     v.co_famille       as CO_RGRP_PRODUITS, 
     sum(v.mt_ca_net_ttc)     as MT_CA_NET_TTC, 
     0         as MT_OBJ_CA_NET_TTC, 
     0         as NB_CLIENTS, 
     sum(v.mt_ca_net_ttc * DECODE(mtransf.flag_mag_comp, 'NC', 0, 1)) 
              as MT_CA_NET_TTC_COMP, 
     0         as MT_OBJ_CA_NET_TTC_COMP, 
     0         as NB_CLIENTS_COMP 
     FROM themis.VENTES_FAM v 
     INNER JOIN kpi.kpi_magasin mtransf 
     ON mtransf.co_societe = CASE WHEN v.co_societe = 1 THEN 1 ELSE 2 END 
     AND mtransf.id_magasin = v.id_magasin 
     WHERE 
      mtransf.co_societe = in_co_societe 
     AND v.dt_jour    = in_dt_jour 
     GROUP BY 
     mtransf.id_mag_transfere, 
     v.co_famille 
     UNION 
     -- Mise a jour des Objectifs ->Non car les objectifs ne sont pas d¿¿finis ¿¿ la famille 
     -- Mise a jour du Nombre de clients 
     SELECT 
     mtransf.id_mag_transfere    as ID_MAGASIN, 
     v.co_famille       as CO_RGRP_PRODUITS, 
     0         as MT_CA_NET_TTC, 
     0         as MT_OBJ_CA_NET_TTC, 
     sum(nb_client)      as NB_CLIENTS, 
     0         as MT_CA_NET_TTC_COMP, 
     0         as MT_OBJ_CA_NET_TTC_COMP, 
     sum(nb_client * DECODE(mtransf.flag_mag_comp, 'NC', 0, 1)) 
              as NB_CLIENTS_COMP 
     FROM ods.nb_clients_mag_fam_j v 
     INNER JOIN kpi.kpi_magasin mtransf 
     ON mtransf.co_societe = CASE WHEN v.co_societe = 1 THEN 1 ELSE 2 END 
     AND mtransf.id_magasin = v.id_magasin 
     WHERE 
      mtransf.co_societe = in_co_societe 
     AND v.dt_jour    = in_dt_jour 
     GROUP BY 
     mtransf.id_mag_transfere, 
     v.co_famille 
    ) sourceunion 
    INNER JOIN kpi.kpi_magasin m 
    ON m.co_societe = in_co_societe 
    AND m.id_magasin = sourceunion.id_magasin 
    GROUP BY 
     m.co_magasin, 
     sourceunion.CO_RGRP_PRODUITS 
) source 
    ON (
     cible.co_societe = source.co_societe 
    and cible.dt_jour  = source.dt_jour 
    and cible.type_entite = source.type_entite 
    and cible.code_entite = source.code_entite 
    and cible.type_rgrp_produits = source.type_rgrp_produits 
    and cible.co_rgrp_produits = source.co_rgrp_produits 
) 
WHEN NOT MATCHED THEN 
    INSERT (
     cible.CO_SOCIETE, 
     cible.DT_JOUR, 
     cible.TYPE_ENTITE, 
     cible.CODE_ENTITE, 
     cible.TYPE_RGRP_PRODUITS, 
     cible.CO_RGRP_PRODUITS, 
     cible.MT_CA_NET_TTC, 
     cible.MT_OBJ_CA_NET_TTC, 
     cible.NB_CLIENTS, 
     cible.MT_CA_NET_TTC_COMP, 
     cible.MT_OBJ_CA_NET_TTC_COMP, 
     cible.NB_CLIENTS_COMP 
    ) 
    VALUES (
     source.CO_SOCIETE, 
     source.DT_JOUR, 
     source.TYPE_ENTITE, 
     source.CODE_ENTITE, 
     source.TYPE_RGRP_PRODUITS, 
     source.CO_RGRP_PRODUITS, 
     source.MT_CA_NET_TTC, 
     source.MT_OBJ_CA_NET_TTC, 
     source.NB_CLIENTS, 
     source.MT_CA_NET_TTC_COMP, 
     source.MT_OBJ_CA_NET_TTC_COMP, 
     source.NB_CLIENTS_COMP 
    ); 

有没有办法用蜂巢做到这一点?

感谢您的帮助。

+0

我建议你开始简单的例子..它会帮助你理解问题。您给出的例子很复杂..将无法直接回答。 – Sanjiv

回答

1

您的问题中的PL/SQL语句对于这样一个普遍的问题有点太长。我可能会遇到麻烦,但我的理解是,您将插入到某个查询的KPI.THM_CA_RGRP_PRODUITS_JOUR表结果中,除非它们与现有行匹配。

Hadoop不支持附加到现有的HDFS文件,但您可以告诉Hive将一些HDFS目录视为分区。

表中名称中的单词“JOUR”使我认为其中的数据可以按天自然分区。我建议在源系统中执行E和T步骤,即使用SELECT的结果生成CSV文件。然后将其加载到HDFS中。如果您每天执行导出操作,并且可以缩小要在源代码中插入的记录,则只需告知Hive即将向表中添加新分区。

如果您必须将表中已经存在的记录归档出来,这可能是您使用MERGE而不是直接插入的原因,您可能需要编写一个简单的Map/Reduce作业进行合并新的数据与现有的数据。