【问题标题】:pyspark withcolumn condition based on another dataframe基于另一个数据框的带有列条件的pyspark
【发布时间】:2021-06-04 17:43:43
【问题描述】:

我有输入:

数据框 A:

valueX valueY
     1      2
     4      3
    -1      4

数据框 B:

startX endX startY endY
     0    2      2    4
     3    5     -2   -1
    -2    0      0    4

我想获得输出,将isIn 列添加到 A:

valueX valueY isIn
     1      2 True
     4      3 False 
    -1      4 True

条件 startX

我试试这个:

dataframeA.join(dataframeB).withColumn("isIn",sf.when((dataframeA["valueX"] > dataframeB["startX"]) & (dataframeA["valueX"] < dataframeB["endX"]) & (dataframeA["valueY"] > dataframeB["startY"]) & (dataframeA["valueY"] < dataframeB["endY"]),
                        True).otherwise(False)))

但我必须删除重复的 isInvalueXvalueY 行。

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql


    【解决方案1】:

    您可以进行半连接和反连接并将结果合并:

    import pyspark.sql.functions as F
    
    dfa_joined = dfa.alias('a').join(
        dfb.alias('b'), 
        F.col('a.valueX').between(F.col('b.startX'), F.col('b.endX')) & 
        F.col('a.valueY').between(F.col('b.startY'), F.col('b.endY')), 
        'left_semi'
    ).withColumn('isIn', F.lit(True))
    
    dfb_joined = dfa.alias('a').join(
        dfb.alias('b'), 
        F.col('a.valueX').between(F.col('b.startX'), F.col('b.endX')) & 
        F.col('a.valueY').between(F.col('b.startY'), F.col('b.endY')), 
        'left_anti'
    ).withColumn('isIn', F.lit(False))
    
    result = dfa_joined.unionAll(dfb_joined).show()
    +------+------+-----+
    |valueX|valueY| isIn|
    +------+------+-----+
    |     1|     2| true|
    |    -1|     4| true|
    |     4|     3|false|
    +------+------+-----+
    

    【讨论】:

    • 感谢您的回答!我还有一些问题,如果dfb表很大,重复join判断是不是很浪费时间?
    • 在这种情况下,您可以进行正常的左连接,并使用 dfb 中的列是否为空作为isIn 的标准
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2021-11-05
    • 2020-11-12
    • 1970-01-01
    • 2022-07-18
    • 1970-01-01
    相关资源
    最近更新 更多