在 IMPALA/HIVE 中添加带有 SELECT 的新列后,旧表数据变为 NULL

Posted

技术标签:

【中文标题】在 IMPALA/HIVE 中添加带有 SELECT 的新列后,旧表数据变为 NULL【英文标题】:Old tables data becomes NULL after adding a new column with a SELECT in IMPLA/HIVE 【发布时间】:2019-07-22 08:26:45 【问题描述】:

我正在尝试使用 (SELECT,JOIN) 查询将数据添加到 Impala 中的新列,一旦我将数据添加到新列,我就会丢失所有其他列的数据(它们变为 NULL)。

在这里我创建了第一个表:

CREATE TABLE mng_exp.KPI_LATENCE_JOUR
(
    CODEINSEE       INT,
    IMEI            BIGINT,
    SEMAINE         INT,
    MOYENNE_LATENCE INT,
    MAXIMUM_LATENCE INT,
    MINIMUM_LATENCE INT
)

我在表格中添加数据:

INSERT INTO mng_exp.KPI_LATENCE_JOUR (CODEINSEE,IMEI, SEMAINE, MOYENNE_LATENCE,MAXIMUM_LATENCE,MINIMUM_LATENCE,TRANCHE_DE_LATENCE) 
SELECT codeinsee, device_dim__imei as IMEI,weekofyear(jour) as SEMAINE, cast(round(avg(rtt_avg_ms)) as integer) as MOYENNE_LATENCE, 
cast(round(avg(rtt_max_ms)) as integer) as MAXIMUM_LATENCE, cast(round(avg(rtt_min_ms)) as integer) as MINIMUM_LATENCE , 
CASE WHEN ( round(avg(rtt_avg_ms)) > 0 and round(avg(rtt_avg_ms)) <= 10 ) THEN 0 
WHEN ( round(avg(rtt_avg_ms)) > 10 and round(avg(rtt_avg_ms)) <= 20 ) THEN 1 
WHEN ( round(avg(rtt_avg_ms)) > 20 and round(avg(rtt_avg_ms)) <= 30 ) THEN 2 
WHEN ( round(avg(rtt_avg_ms)) > 30 ) THEN 3 END AS Tranche_de_latence

FROM mscore.mscore where operateur = 'BT_HZ' and year(jour) = 2019 group by device_dim__imei,weekofyear(jour),codeinsee 



# I  Add a new column

ALTER TABLE mng_exp.kpi_latence_jour ADD COLUMNS (srv_id BIGINT)

#Here data is good and new column srv_id is NULL 

我将数据添加到新列:

INSERT INTO mng_exp.KPI_LATENCE_jour (srv_id) 
    SELECT CAST(dng_fai_cli_eqt_iad.srv_id AS BIGINT)
    FROM msf_exploratoire.dng_fai_cli_eqt_iad
    INNER JOIN mng_exp.kpi_latence_jour ON (dng_fai_cli_eqt_iad.num_serie = kpi_latence_jour.imei);

问题出在:srv_id 正常,旧列变为 NULL。

我没有查询错误,但我丢失了所有旧数据

【问题讨论】:

您只插入一列。也添加所有其他列 你好,谢谢你的回答,我试过了,但我在选择行出现错误,你知道我该怎么写吗?提前谢谢你 添加了我的答案 【参考方案1】:

您只插入一列。使用 INSERT OVERWRITE 并添加所有其他列:

INSERT OVERWRITE TABLE mng_exp.KPI_LATENCE_jour (CODEINSEE,IMEI, SEMAINE, MOYENNE_LATENCE,MAXIMUM_LATENCE,MINIMUM_LATENCE,TRANCHE_DE_LATENCE,srv_id) 
    SELECT b.CODEINSEE,
           b.IMEI,
           b.SEMAINE,
           b.MOYENNE_LATENCE,
           b.MAXIMUM_LATENCE,
           b.MINIMUM_LATENCE,
           b.TRANCHE_DE_LATENCE,
           CAST(a.srv_id AS BIGINT) srv_id
      FROM msf_exploratoire.dng_fai_cli_eqt_iad a
           INNER JOIN mng_exp.kpi_latence_jour  b ON (a.num_serie = b.imei)
      ;

【讨论】:

太棒了!工作完美,谢谢先生/妈妈!祝你有美好的一天! 你好@leftjoin,我尝试了相同的代码来添加其他列,但外壳停止在 100%,你知道为什么它不能添加这些列吗? @FirasMegrahi 您可以在表名(CODEINSEE,IMEI,...)之后没有列列表的情况下执行相同操作。只需将 select 中的列保持与表 DDL 中相同的顺序和编号 @FirasMegrahi 不,我不明白你的意思是外壳在 100% 处停止你的意思是 map-reduce 停止吗?检查您在 num_serie 中是否存在偏差【参考方案2】:

您确定丢失了所有旧数据还是执行:

select * from mng_exp.KPI_LATENCE_JOUR

你还会看到:

    第一组行(srv_id 为空的行); 第二组行 - 唯一填充的列是 srv_id 的行?

您想要更新第一组行的 SRV_ID。

您可以在 imapala 中查看有关更新的更多详细信息,here。

【讨论】:

完美!我正要写这个! :) 您好,谢谢您的回答,我现在再次验证,是的,我丢失了所有旧数据,所以没有两组数据。 :( 您确定插入语句是“插入到 mng_exp.KPI_LATENCE_jour (srv_id)”还是“INSERT OVERWRITE TABLE mng_exp.KPI_LATENCE_jour (srv_id)”?跨度> 这是一个 INSERT INTO,我尝试了插入覆盖,但我遇到了同样的问题。

以上是关于在 IMPALA/HIVE 中添加带有 SELECT 的新列后,旧表数据变为 NULL的主要内容,如果未能解决你的问题,请参考以下文章

在 Impala/Hive 中删除多个分区

如何摆脱 Hive/Impala 中的重复计数

计算 json 对象中键的出现次数 - IMPALA/HIVE

在cm安装的大数据管理平台中集成impala之后读取hive表中的数据的设置(hue当中执行impala的数据查询)

Impala/Hive - 汇总调整代码的金额

无法从 impala/hive/spark sql 访问“spark 注册表”