自加入时 hive 的缓慢处理
Posted
技术标签:
【中文标题】自加入时 hive 的缓慢处理【英文标题】:slow processing of hive on self join 【发布时间】:2014-08-26 08:21:59 【问题描述】:我有一个 hive 表,我在其中基于 ip 进行自我加入和加入,并区分名称并减去字符串格式的日期,方法是使用 unix_timestamp 将其转换为秒并减去时间。但是这需要很多时间。
Create table t1 (a_name string,a_Code bigint,a_Time string,
a_Ipaddress string, b_name string,b_Code bigint,b_TIME string,b_Ipaddress
string,date1 string)
STORED as RCFILE;
INSERT INTO TABLE NETWORK_Sharing
SELECT n1.a_name,n1.a_Code,n1.a_TIME ,n1.a_Ipaddress,n2.b_name ,n2.b_Code,n2.b_TIME,
n2.b_Ipaddress,n1.date1 from t n1 JOIN t n2
ON (n1.a_Ipaddress=n2.b_Ipaddress)
where n1.a_name <> n2.b_name AND
(unix_timestamp(n1.a_TIME,'yyyy-MM-dd HH:mm:ss') -
unix_timestamp(n2.b_TIME,'yyyy-MM-dd HH:mm:ss')) <= 300 AND
(unix_timestamp(n1.TIME,'yyyy-MM-dd HH:mm:ss') -
unix_timestamp(n2.TIME,'yyyy-MM-dd HH:mm:ss')) >= 0;
【问题讨论】:
t
中每个ip地址有多少行?
【参考方案1】:
如果可能的话,我会避免自连接,并使用收集来执行聚合而不是连接。查看这篇讨论类似用例的博文 (http://brickhouseconfessions.wordpress.com/2013/03/05/use-collect-to-avoid-the-self-join/)
在你的情况下,你基本上想看看两个事件是否同时发生,所以它可能有点棘手。类似的东西呢
CREATE TABLE t1
AS
SELECT Ipaddress,
cast( TIME/300 as bigint ) as EVENT_TIME_BUCKET,
collect( name ) as NAMES,
collect( code ) as CODES
collect( TIME ) as TIMES
FROM t
GROUP BY
IpAddress, cast(TIME/300 as bigint)
HAVING count(*) > 1;
我猜您可能想要更大的 600 个时间段,具体取决于您的用例, 并消除与您的条件不匹配的行。 (即。类似的东西 在哪里 ! (大小(TIMES) == 2 AND array_index(TIMES, 1) - array_index(TIMES, 0) > 300) ) 但您的实际查询或阈值将取决于您的数据集。
【讨论】:
以上是关于自加入时 hive 的缓慢处理的主要内容,如果未能解决你的问题,请参考以下文章