我尝试将两个Dataframe合并到一个值不完全相同的列中。
下面给出的是df1
+--------+-----+------+
| NUM_ID | TIME|SG1_V |
+--------+-----+------+
|XXXXX01 |1001 |79.0 |
|XXXXX01 |1005 |88.0 |
|XXXXX01 |1010 |99.0 |
|XXXXX01 |1015 |null |
|XXXXX01 |1020 |100.0 |
|XXXXX02 |1001 |81.0 |
|XXXXX02 |1010 |91.0 |
|XXXXX02 |1050 |93.0 |
|XXXXX02 |1060 |93.0 |
|XXXXX02 |1070 |93.0 |
+--------+-----+------+
下面是df2
+---------+-----+------+
| NUM_ID | TIME|SG2_V |
+---------+-----+------+
|XXXXX01 |1001 | 99.0|
|XXXXX01 |1003 | 22.0|
|XXXXX01 |1007 | 85.0|
|XXXXX01 |1011 | 1.0 |
|XXXXX02 |1001 | 22.0|
|XXXXX02 |1009 | 85.0|
|XXXXX02 |1048 | 1.0 |
|XXXXX02 |1052 | 99.0|
+---------+-----+------+
我必须在num\u id列和time列上连接这两个df,前者应该完全相同,后者可能/可能不完全相同。
df2中的时间可能/可能不包含df1中的精确值。如果值不精确,那么我必须使用可用的最高最近值(即df2中的列值应为=<df1中的精确值)联接。
在看了下面所示的预期输出之后,会更加清楚。
+--------+-----+------+-----+------+
| NUM_ID | TIME|SG1_V | TIME|SG2_V |
+--------+-----+------+-----+------+
|XXXXX01 |1001 |79.0 |1001 | 99.0|
|XXXXX01 |1005 |88.0 |1003 | 22.0|
|XXXXX01 |1010 |99.0 |1007 | 85.0|
|XXXXX01 |1015 |null |1011 | 1.0 |
|XXXXX01 |1020 |100.0 |1011 | 1.0 |
|XXXXX02 |1001 |81.0 |1001 | 22.0|
|XXXXX02 |1010 |91.0 |1009 | 85.0|
|XXXXX02 |1050 |93.0 |1048 | 1.0 |
|XXXXX02 |1060 |93.0 |1052 | 99.0|
|XXXXX02 |1070 |93.0 |1052 | 99.0|
+--------+-----+------+-----+------+
对于num_id xx 01,df1中的时间(1005)在df2中不可用,因此它采用小于1005的最近值(1003)。
如何以这样的方式连接,如果没有精确的值,则使用最近的值连接。
感谢任何线索。提前谢谢。
3条答案
按热度按时间monwx1rj1#
简单的方法是使用spark的一个窗口函数row\u number()或rank():
eqzww0vc2#
如果需要使用两个字段和其中一个字段的特定间隔进行连接,可以执行以下操作:
结果如下:
ycggw6v23#
上面的解决方案是在将Dataframe保存到配置单元表之后连接Dataframe。
我尝试通过应用相同的逻辑连接两个Dataframe而不保存到配置单元表中,如下所示。
这是否等同于上述提供的解决方案