自加入时 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 的缓慢处理的主要内容,如果未能解决你的问题,请参考以下文章

hive缓慢变化维

[Hive]Hive自定义函数UDF

与多处理一起使用时,PyTesseract 调用工作非常缓慢

如何处理hive中的数据倾斜

hive自定义函数开发与部署

hive自定义函数开发与部署