簡體   English   中英

根據匹配值加入兩個 pyspark dataframe(小數點后)

[英]join two pyspark dataframe based on matching value(upto certain decimal point)

我在 pyspark 中有兩個 dataframe: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|

我想根據匹配的經緯度值加入這兩個表,最多 2 位小數。 所以我想要的 output dataframe 是:

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 中考慮最多兩位小數

在您的連接條件中使用substring

df3=df1.join(df2, df1.new_lat == substring(df2.lat,1,5), 'left')

substring絕對是最簡單的實現,但並不總能提供您可能需要的精度(想想 0.5 的 int 舍入)。

為了獲得更好的准確性,您可以使用快速過濾器:

threshold = 0.01

df3 = (
    df1
    .join(df2)
    .filter(df1.new_lat - threshold < df2.lat)
    .filter(df2.lat < df1.new_lat + threshold)
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM