【发布时间】:2019-02-02 11:55:50
【问题描述】:
我有另一个解决方案,但我更喜欢使用 PySpark 2.3 来做。
我有一个这样的二维 PySpark 数据框:
Date | ID
---------- | ----
08/31/2018 | 10
09/31/2018 | 10
09/01/2018 | null
09/01/2018 | null
09/01/2018 | 12
我想通过查找过去最接近的值来替换ID null 值,或者如果该值为 null,则向前看(如果再次为 null,则设置默认值)
我曾设想用.withColumn 添加一个新列,并使用一个UDF 函数来查询数据框本身。
类似的伪代码(不完美,但它是主要思想):
from pyspark.sql.types import StringType
from pyspark.sql.functions import udf
def return_value(value,date):
if value is not null:
return val
value1 = df.filter(df['date']<= date).select(df['value']).collect()
if (value1)[0][0] is not null:
return (value1)[0][0]
value2 = df.filter(tdf['date']>= date).select(df['value']).collect()
return (value2)[0][0]
value_udf = udf(return_value,StringType())
new_df = tr.withColumn("new_value", value_udf(df.value,df.date))
但它不起作用。我完全走错了路吗?是否只能在 UDF 函数中查询 Spark 数据帧?我错过了一个更简单的解决方案吗?
【问题讨论】:
-
在您的示例中,您有 3 行具有相同的日期,其中 2 行带有空值。在这种情况下,您试图获得的预期结果是什么?您想从 09/31/2018 行中为两个空值获取 10 还是只为第一个空值和 12(从最后一行)获取第二个空记录?看着你的熊猫代码,我假设是前者。
标签: pyspark pyspark-sql