Hive SQL:删除具有类似ID的行的其他方法

时间:2014-07-08 07:47:31

标签: sql hadoop hive

我有一个包含多个列的表格。这是一个例子(列数较少):

PROTOCOL   LINE_FORMAT   SERVICE    MSISDN   
c3p0       solid         cyborg     639275487638
r2r2       rounded       amech      639124512070
c3pX       etc..         etc..      639275487638
bxSer      hard          comm       639200020006

现在,MSISDN发生了两次。据推测,结果应该只包含一个唯一的MSISDN,而不管其他数据 - 尽管这并不意味着不需要其他数据。

以下是我的尝试:

SELECT max(PROTOCOL), max(LINE_FORMAT), max(NEURALITIC), max(OP_SERVICE1), max(OP_SERVICE2), max(OP_SERVICE3), max(DATESTAMP), max(APP_NAME), max(IMSI), MSISDN, max(OP_ID), max(OP_LOCATION_ID), max(ROAMER_FLAG), max(TAC), max(LOCATION_LAYER1), max(LOCATION_LAYER2), max(LOCATION_LAYER3), max(LOCATION_LAYER4), max(LOCATION_LAYER5), max(SGSN), max(GGSN), max(APN), max(WEBDOMAIN), max(PROBE_NAME), max(FILE_ID), max(RAT), max(OUT_BYTES), min(IN_BYTES), max(TRANSACTION_COUNT) 
FROM june21dataloader WHERE NEURALITIC LIKE "%Application Usage%" AND WEBDOMAIN LIKE "%bpiexpressonline.com%" GROUP BY MSISDN;

现在,当我尝试这个时,我很确定我有独特的流氓 - 因为原始的2000万行,它只返回了2900左右。

令人不安,当预计输出至少 6k ++

这里有点腥。我的查询有问题吗?如果我放弃max()'会发生什么?

现在,我的问题是,做这项工作的其他方式是什么?据我所知,DISTINCT似乎只在一个列上工作,而GROUP BY一直在询问所有列名称(我甚至不确定是否它将产生一个独特的MSISDN)。

感谢。

1 个答案:

答案 0 :(得分:1)

您可以执行类似

的操作
SELECT * FROM
    (SELECT *, RANK() OVER (PARTITION BY MSISDN ORDER BY <CreatedDateOrSomething>) AS Rank
    FROM <Your_Table>) AS SUBQUERY
WHERE Rank = 1

这将为每个MSISDN提供一个条目。其余列将是具有最小CreatedDateOrSomething

的条目的数据

但如果其他数据无关紧要,那你为什么不做呢

SELECT DISTINCT(MSISDN) FROM <Your_Table>