pyspark中的内部连接
我有一个pyspark数据帧(df1),它由10K行组成,数据帧如下所示-pyspark中的内部连接,pyspark,pyspark-sql,Pyspark,Pyspark Sql,我有一个pyspark数据帧(df1),它由10K行组成,数据帧如下所示- id mobile_no value 1 1111111111 .43 2 2222222222 .54 3 3333333333 .03 4 4444444444 .22 mobile_no gender 912222222222 M 914
id mobile_no value
1 1111111111 .43
2 2222222222 .54
3 3333333333 .03
4 4444444444 .22
mobile_no gender
912222222222 M
914444444444 M
919999999999 F
915555555555 M
918888888888 F
mobile_no value gender
2222222222 .54 M
4444444444 .22 M
另一个pyspark数据帧(df2)由100k条记录组成,看起来像-
id mobile_no value
1 1111111111 .43
2 2222222222 .54
3 3333333333 .03
4 4444444444 .22
mobile_no gender
912222222222 M
914444444444 M
919999999999 F
915555555555 M
918888888888 F
mobile_no value gender
2222222222 .54 M
4444444444 .22 M
我希望使用pyspark进行内部连接,最终数据帧如下所示-
id mobile_no value
1 1111111111 .43
2 2222222222 .54
3 3333333333 .03
4 4444444444 .22
mobile_no gender
912222222222 M
914444444444 M
919999999999 F
915555555555 M
918888888888 F
mobile_no value gender
2222222222 .54 M
4444444444 .22 M
df2中移动单元编号的长度为12,而df1中移动单元编号的长度为10。我可以加入,但这是一个昂贵的行动。
使用pyspark有什么帮助吗
common_cust = spark.sql("SELECT mobile_number, age \
FROM df1 \
WHERE mobile_number IN (SELECT DISTINCT mobile_number FROM df2)")
一种方法是使用df2
上的函数仅保留最后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|
+----------+------+
然后,您只需进行一次内部测试,即可获得预期的输出:
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)""")
一种方法是使用df2
上的函数仅保留最后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|
+----------+------+
然后,您只需进行一次内部测试,即可获得预期的输出:
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)""")