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

Posted

技术标签:

【中文标题】根据匹配值加入两个 pyspark 数据帧(直到某个小数点)【英文标题】:join two pyspark dataframe based on matching value(upto certain decimal point) 【发布时间】:2020-07-06 14:18:47 【问题描述】:

我在 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 的行数超过 1 亿行,我怎样才能有效地做到这一点。

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

【问题讨论】:

到目前为止你尝试了什么? @ScootCork 我试过这个,但不确定如何在连接语句df3 = df1.join(df2, df1. new_lat == df2. lat, 'left')中考虑最多 2 位小数 我想最直接的方法是将df2.lat 列四舍五入到小数点后两位,然后加入该列。 【参考方案1】:

在您的加入条件中使用 substring

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

【讨论】:

【参考方案2】:

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)
)

【讨论】:

以上是关于根据匹配值加入两个 pyspark 数据帧(直到某个小数点)的主要内容,如果未能解决你的问题,请参考以下文章

加入两个 Pyspark 数据帧的两种方法有啥区别

Pyspark:如何根据另一列中的匹配值从数组中的第一次出现中选择直到最后的值

加入两个数据框pyspark

pyspark 数据框比较以根据关键字段查找列差异

优先加入 PySpark 数据帧

如何根据来自其他 pyspark 数据帧的日期值过滤第二个 pyspark 数据帧?