我有一个配置单元表,在这个表中,我在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;
1条答案
按热度按时间2skhul331#
如果可能的话,我会避免使用自连接,并使用collect来执行聚合而不是连接。查看这篇讨论类似用例的博客(http://brickhouseconfessions.wordpress.com/2013/03/05/use-collect-to-avoid-the-self-join/ )
在您的例子中,您基本上希望看到两个事件是否同时发生,因此这可能有点棘手。像这样的怎么样
我猜您可能需要一个更大的时间段600,这取决于您的用例,并消除与您的标准不匹配的行比如说在哪里size(times)==2和array_index(times,1)-array_index(times,0)>300),但实际查询或阈值将取决于数据集。