PySpark DataFrame 根据另一列中时间戳值的最小/最大条件更新列值
Posted
技术标签:
【中文标题】PySpark DataFrame 根据另一列中时间戳值的最小/最大条件更新列值【英文标题】:PySpark DataFrame update column value based on min/max condition on timestamp value in another column 【发布时间】:2020-08-06 06:20:07 【问题描述】:我有以下数据框:
col1 col2
1 2020-02-27 15:00:00
1 2020-02-27 15:04:00
我需要输出为
col1 col2 col3
1 2020-02-27 15:00
1 2020-02-27 15:04 Y
根据 col2 中存在的最大时间戳值,col3 值必须填充为 Y 或 null。
我尝试了以下方法:
df = spark.sql("select col1,col2 from table")
max_ts = df.select(max("col2")).show()
y=(f.when(f.col('col2') == max_ts, "Y"))
df1 = df.withColumn('col3',y)
上述方法只产生空输出。
请提出可能的解决方案或错误?
TIA。
编辑:我需要在 col1 上执行 groupBy 并在 col2 中获取最大值
【问题讨论】:
【参考方案1】:也许这有帮助-
DSL API
max(..).over(window)
df2.show(false)
df2.printSchema()
/**
* +----+-------------------+
* |col1|col2 |
* +----+-------------------+
* |1 |2020-02-27 15:00:00|
* |1 |2020-02-27 15:04:00|
* +----+-------------------+
*
* root
* |-- col1: integer (nullable = true)
* |-- col2: timestamp (nullable = true)
*/
val w = Window.partitionBy("col1")
df2.withColumn("col3",
when(max("col2").over(w).cast("long") - col("col2").cast("long")=== 0, "Y")
)
.show(false)
/**
* +----+-------------------+----+
* |col1|col2 |col3|
* +----+-------------------+----+
* |1 |2020-02-27 15:00:00|null|
* |1 |2020-02-27 15:04:00|Y |
* +----+-------------------+----+
*/
Spark SQL
df2.createOrReplaceTempView("table")
spark.sql(
"""
| select col1, col2,
| case when (cast(max(col2) over (partition by col1) as long) - cast(col2 as long) = 0) then 'Y' end as col3
| from table
""".stripMargin)
.show(false)
/**
* +----+-------------------+----+
* |col1|col2 |col3|
* +----+-------------------+----+
* |1 |2020-02-27 15:00:00|null|
* |1 |2020-02-27 15:04:00|Y |
* +----+-------------------+----+
*/
【讨论】:
建议的解决方案已经奏效。感谢您的帮助:)以上是关于PySpark DataFrame 根据另一列中时间戳值的最小/最大条件更新列值的主要内容,如果未能解决你的问题,请参考以下文章
获取由 PySpark Dataframe 上的另一列分组的列的不同元素