pyspark中的内部连接

Posted

技术标签:

【中文标题】pyspark中的内部连接【英文标题】:inner join in pyspark 【发布时间】:2019-06-21 05:29:09 【问题描述】:

我有一个 pyspark 数据框(df1),它由 10K 行组成,数据框看起来像 -

id       mobile_no       value
1        1111111111        .43
2        2222222222        .54
3        3333333333        .03
4        4444444444        .22

另一个 pyspark 数据帧 (df2) 包含 100k 条记录,看起来像 -

mobile_no            gender
912222222222           M
914444444444           M
919999999999           F
915555555555           M
918888888888           F

我想使用 pyspark 进行内部连接,其中最终数据框看起来像 -

mobile_no          value           gender
2222222222         .54               M
4444444444         .22               M

df2 中 mobile_no 的长度为 12,但 df1 中为 10。我可以加入它,但它的操作成本很高。 使用 pyspark 有什么帮助吗?

common_cust = spark.sql("SELECT mobile_number, age \
                         FROM df1 \
                         WHERE mobile_number IN (SELECT DISTINCT mobile_number FROM df2)")

【问题讨论】:

【参考方案1】:

一种方法是在df2 上使用substring 函数,以仅保留最后10 位数字以获得与df1 相同的长度:

import pyspark.sql.functions as F

ddf2.select(F.substring('mobile_no', 3, 10).alias('mobile_no'),'gender').show()
+----------+------+
| mobile_no|gender|
+----------+------+
|2222222222|     M|
|4444444444|     M|
|9999999999|     F|
|5555555555|     M|
|8888888888|     F|
+----------+------+

然后你只需要做一个内部join 来获得你预期的输出:

common_cust = df1.select('mobile_no', 'value')\
                 .join( df2.select(F.substring('mobile_no', 3, 10).alias('mobile_no'),'gender'), 
                        on=['mobile_no'], how='inner')
common_cust.show()
+----------+-----+------+
| mobile_no|value|gender|
+----------+-----+------+
|2222222222| 0.54|     M|
|4444444444| 0.22|     M|
+----------+-----+------+

如果你想使用spark.sql,我想你可以这样做:

common_cust = spark.sql("""select df1.mobile_no, df1.value, df2.gender
                           from df1
                           inner join df2 
                           on df1.mobile_no = substring(df2.mobile_no, 3, 10)""")

【讨论】:

以上是关于pyspark中的内部连接的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark:内部连接两个 pyspark 数据帧并从第一个数据帧中选择所有列,从第二个数据帧中选择几列

python + pyspark:在pyspark中进行多列比较的内部连接错误

如何通过不同级别的枢轴聚合然后在pyspark中进行内部连接?

在 PySpark 中的文字列上检测到 INNER 连接的笛卡尔积

如何在pyspark /中的结构内爆炸结构中的内部数组

pyspark 内连接的替代方法来比较 pyspark 中的两个数据帧