Hive加入以获得日期明智的图片

时间:2017-04-17 22:40:06

标签: hadoop join hive

我正在尝试使用表B中的键和日期以及加入时 对应的表A 中最近的最接近日期记录来加入HIVE中的2个表格。例如:下面是2个输入表

<----------TABLE A------------->            <------------TABLE B------------>
A_id    A_date      changed_col             B_id    B_date      B_value A_id
****    ******      ***********             ****    ******      ******* *****   
A01     2017-03-20      ABC                 B01     2017-04-02  200     A01
A01     2017-04-01      XYZ                 B01     2017-04-04  500     A01
A01     2017-04-05      LLL                 B02     2017-04-07  900     A02
A02     2017-04-06      KKK                 B02     2017-04-30  800     A02
A02     2017-04-12      JJJ

但是当我用表A加入表B时,它应该在表A中查找相同键(A_id)中最接近的最低日期。以下是预期的输出表:

B_id    B_date          A_id        A_date      changed_col   B_value
****    ******          ****        ******      ***********   *******
B01     2017-02-04      A01     2017-01-04      XYZ             200 
B01     2017-04-04      A01     2017-01-04      XYZ             500
B02     2017-04-07      A02     2017-04-06      KKK             900
B02     2017-04-30      A02     2017-04-12      JJJ             800

非常感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:0)

自己想出查询

select * from 
(select b.*, a.*,
row_number() over (partition by b.a_id, b.b_date 
order by b.b_date, datediff(to_date(b.b_date), to_date(a.a_date)) ) as rnk
FROM b JOIN a 
ON b.a_id= a.a_id 
WHERE a.a_date <= b.b_date
) j1 where j1.rnk = 1

B_id    B_date          B_value A_id            A_date      changed_col rnk   
B01     2017-04-02      200     A01     A01     2017-04-01      XYZ     1
B01     2017-04-04      500     A01     A01     2017-04-01      XYZ     1
B02     2017-04-07      900     A02     A02     2017-04-06      KKK     1
B02     2017-04-30      800     A02     A02     2017-04-12      JJJ     1

您可以在第1行中选择所需的列。现在,我已选择A和B中的所有列,包括排名。

答案 1 :(得分:-2)

可以通过使用子字符串函数在两个表的日期上指定where条件来实现。

where a.substring(A_date,1,7) = b.substring(B_date,1,7)

您可以使用where在此AND子句中添加其他条件,具体取决于所需的结束日期规范。