根据匹配值(到某个小数点)加入两个pyspark数据框

我在 pyspark 中有两个数据框:df1


+-------+--------+----------------+-------------+                               

|new_lat|new_long|        lat_long|   State_name|

+-------+--------+----------------+-------------+

|  33.64| -117.63|[33.64,-117.625] |STATE 1     |

|  23.45| -101.54|[23.45,-101.542] |STATE 2     |

+-------+--------+----------------+-------------+

df2


+---------+-----+--------------------+----------+------------+

|    label|value|            dateTime|       lat|        long|

+---------+-----+--------------------+----------+------------+

|msg      |  437|2019-04-06T05:10:...|33.6436263|-117.6255508|

|msg      |  437|2019-04-06T05:10:...|33.6436263|-117.6255508|

|msg      |  437|2019-04-06T05:10:...| 23.453622|-101.5423864|

|msg      |  437|2019-04-06T05:10:...| 23.453622|-101.5420964|

我想根据匹配的 lat,long 值加入这两个表,最多 2 个小数点。所以我想要的输出数据框是:


DF3


+---------+-----+--------------------+----------+------------+------+

|    label|value|            dateTime|       lat|        long|state |

+---------+-----+--------------------+----------+------------+-------

|msg      |  437|2019-04-06T05:10:...|33.6436263|-117.6255508|STATE 1

|msg      |  437|2019-04-06T05:10:...|33.6436263|-117.6255508|STATE 1

|msg      |  437|2019-04-06T05:10:...| 23.453622|-101.5423864|STATE 2

|msg      |  437|2019-04-06T05:10:...| 23.453622|-101.5420964|STATE 2

考虑到 df2 有超过 100M 行,我怎样才能有效地做到这一点。


我试过df3=df1.join(df2, df1. new_lat == df2. lat, 'left')但不确定如何在 df1 中考虑最多两位小数


慕的地6264312
浏览 203回答 2
2回答

沧海一幻觉

substring在您的加入条件中使用。df3=df1.join(df2, df1.new_lat == substring(df2.lat,1,5), 'left')

胡子哥哥

substring绝对是最简单的实现,但并不总能为您提供所需的准确性(想想 0.5 的整数舍入)。为了获得更好的准确性,您可以使用快速过滤器:threshold = 0.01df3 = (&nbsp; &nbsp; df1&nbsp; &nbsp; .join(df2)&nbsp; &nbsp; .filter(df1.new_lat - threshold < df2.lat)&nbsp; &nbsp; .filter(df2.lat < df1.new_lat + threshold))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python