在self-join上处理配置单元的速度很慢

hgb9j2n6  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(360)

我有一个配置单元表,在这个表中,我在ip的基础上进行自连接和连接,并在名称上进行区分,然后通过使用unix\u时间戳将日期转换为秒并减去时间来减去字符串格式的日期。但是这需要很多时间。

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;
2skhul33

2skhul331#

如果可能的话,我会避免使用自连接,并使用collect来执行聚合而不是连接。查看这篇讨论类似用例的博客(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,这取决于您的用例,并消除与您的标准不匹配的行比如说在哪里size(times)==2和array_index(times,1)-array_index(times,0)>300),但实际查询或阈值将取决于数据集。

相关问题