left连接并在pysparkDataframe上应用case逻辑

4xrmg8kj  于 2021-05-17  发布在  Spark
关注(0)|答案(1)|浏览(413)

我正在学习编写pyspark代码。我可以通过构建类似sql的 views 在上面使用 .createOrReplaceTempView() 得到我想要的结果。不过,我想学习如何通过直接在Dataframe上操作而不是创建 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() 对于最终列值。
如何通过直接对Dataframe进行操作来实现这一点 df1 以及 df2 而不是构建视图?

rjee0c15

rjee0c151#

可以执行左联接,然后将空时间戳与当前时间戳合并:

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()))

相关问题