внутреннее соединение в pyspark - PullRequest
1 голос
/ 21 июня 2019

У меня есть фрейм данных pyspark (df1), который состоит из 10K строк, а фрейм данных выглядит как -

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

другой фрейм данных pyspark (df2) состоит из 100 тыс. Записей и выглядит как -

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

Я хочу внутреннее объединение с использованием pyspark, где конечный фрейм данных выглядит как -

mobile_no          value           gender
2222222222         .54               M
4444444444         .22               M

длина mobile_no в 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)")

1 Ответ

0 голосов
/ 21 июня 2019

Одним из способов может быть использование функции substring на 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|
+----------+------+

Тогда вам просто нужно сделать внутренний 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)""")
...