【问题标题】:inner join in pysparkpyspark中的内部连接
【发布时间】: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)")

【问题讨论】:

    标签: pyspark pyspark-sql


    【解决方案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)""")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 2019-12-18
      • 1970-01-01
      相关资源
      最近更新 更多