在pyspark内部联接

时间:2019-06-21 05:29:09

标签: pyspark pyspark-sql

我有一个pyspark数据帧(df1),其中包含1万行,数据帧看起来像-

set envelope gis:load-dataset "data/land.shp"
gis:set-world-envelope gis:envelope-of envelope

另一个pyspark数据帧(df2)由10万条记录组成,看起来像-

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

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

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

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

mobile_no          value           gender
2222222222         .54               M
4444444444         .22               M

1 个答案:

答案 0 :(得分:0)

一种方法可能是在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)""")