apache-spark - 用 pyspark 用以前已知的好值填充 null

标签 apache-spark pyspark apache-spark-sql

有没有办法替换null pyspark 数据框中的值具有最后一个有效值?还有其他timestampsession如果您认为 Windows 分区和排序需要它们,则可以使用列。更具体地说,我想实现以下转换:

+---------+-----------+-----------+      +---------+-----------+-----------+
| session | timestamp |         id|      | session | timestamp |         id|
+---------+-----------+-----------+      +---------+-----------+-----------+
|        1|          1|       null|      |        1|          1|       null|
|        1|          2|        109|      |        1|          2|        109|
|        1|          3|       null|      |        1|          3|        109|
|        1|          4|       null|      |        1|          4|        109|
|        1|          5|        109| =>   |        1|          5|        109|
|        1|          6|       null|      |        1|          6|        109|
|        1|          7|        110|      |        1|          7|        110|
|        1|          8|       null|      |        1|          8|        110|
|        1|          9|       null|      |        1|          9|        110|
|        1|         10|       null|      |        1|         10|        110|
+---------+-----------+-----------+      +---------+-----------+-----------+

最佳答案

我相信我有一个比公认的更简单的解决方案。它也使用函数,但使用名为“LAST”的函数并忽略空值。

让我们重新创建类似于原始数据的内容:

import sys
from pyspark.sql.window import Window
import pyspark.sql.functions as func

d = [{'session': 1, 'ts': 1}, {'session': 1, 'ts': 2, 'id': 109}, {'session': 1, 'ts': 3}, {'session': 1, 'ts': 4, 'id': 110}, {'session': 1, 'ts': 5},  {'session': 1, 'ts': 6}]
df = spark.createDataFrame(d)

这打印:
+-------+---+----+
|session| ts|  id|
+-------+---+----+
|      1|  1|null|
|      1|  2| 109|
|      1|  3|null|
|      1|  4| 110|
|      1|  5|null|
|      1|  6|null|
+-------+---+----+

现在,如果我们使用窗口函数 LAST:
df.withColumn("id", func.last('id', True).over(Window.partitionBy('session').orderBy('ts').rowsBetween(-sys.maxsize, 0))).show()

我们只得到:
+-------+---+----+
|session| ts|  id|
+-------+---+----+
|      1|  1|null|
|      1|  2| 109|
|      1|  3| 109|
|      1|  4| 110|
|      1|  5| 110|
|      1|  6| 110|
+-------+---+----+

希望能帮助到你!

关于apache-spark - 用 pyspark 用以前已知的好值填充 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36343482/

相关文章:

hadoop - 是否可以使用 Spark 的 jdbc 驱动程序将 apache Spark 与 jasper 集成?

python - 如何将 unicode 转换为数据框列的字符串?

python - Pyspark 'NoneType'对象没有属性 '_jvm'错误

python - 在 pyspark 中拆分列

scala - 是否可以对 Spark UDAF 进行单元测试?

apache-spark - 如何通过嵌套数组字段(数组中的数组)过滤Spark sql?

sql - 当列中具有不同值时如何连接两个表

apache-spark - PySpark 作业因工作流程模板失败

python - 在 Pyspark 中将 Pandas Dataframe 转换为 Spark Dataframe 时出现类型错误

apache-spark - 将一个数组列与另一( bool )数组列进行子集化