【问题标题】:Left Join and apply case logic on Pyspark Dataframes在 Pyspark Dataframes 上左连接和应用案例逻辑
【发布时间】:2021-03-09 14:35:37
【问题描述】:

我正在学习编写 PySpark 代码。我可以通过使用.createOrReplaceTempView() 在它们之上构建像views 这样的SQL 来连接两个数据框,并获得我想要的输出。但是我想通过直接在数据帧上操作而不是创建views来学习如何做同样的事情。

这是我的代码

df1.createOrReplaceTempView('left_table')
df2.createOrReplaceTempView('right_table')

    spark.sql('''
    select
    l.*,
    CASE WHEN r.id IS NULL THEN current_timestamp() ELSE r.timestamp END ts,
    from
    left_table l 
    left join 
    right_table r
    on l.id = r.id 
    ''').show()

对于匹配 id 我希望从右表中取出timestamp 列。对于仅在左表中可用id,我想使用current_timestamp() 作为最终列值的系统时间戳。

我如何通过直接在数据框 df1df2 上操作而不是构建视图来实现这一点?

【问题讨论】:

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


    【解决方案1】:

    您可以进行左连接,然后将 NULL 时间戳与当前时间戳合并:

    import pyspark.sql.functions as F
    
    df1.join(df2, 'id', 'left') \
       .drop(*[col for col in df2.columns if col != 'timestamp']) \
       .withColumn('timestamp', F.coalesce(F.col('timestamp'), F.current_timestamp()))
       
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 2021-11-20
      相关资源
      最近更新 更多