first_value pyspark 中的窗口函数
first_value windowing function in pyspark
我正在使用 pyspark 1.5 从 Hive 表获取数据并尝试使用 windowing 函数。
根据 this,存在一个名为 firstValue
的分析函数,它将为我提供给定 window 的第一个非空值。我知道这存在于 Hive 中,但我无法在任何地方的 pyspark 中找到它。
鉴于 pyspark 不允许 UserDefinedAggregateFunctions (UDAF),有没有办法实现这个?
Spark >= 2.0:
first
接受一个可选的 ignorenulls
参数,它可以模仿 first_value
:
的行为
df.select(col("k"), first("v", True).over(w).alias("fv"))
Spark < 2.0:
可用函数被调用first
,可以按如下方式使用:
df = sc.parallelize([
("a", None), ("a", 1), ("a", -1), ("b", 3)
]).toDF(["k", "v"])
w = Window().partitionBy("k").orderBy("v")
df.select(col("k"), first("v").over(w).alias("fv"))
但如果您想忽略空值,则必须直接使用 Hive UDF:
df.registerTempTable("df")
sqlContext.sql("""
SELECT k, first_value(v, TRUE) OVER (PARTITION BY k ORDER BY v)
FROM df""")
我正在使用 pyspark 1.5 从 Hive 表获取数据并尝试使用 windowing 函数。
根据 this,存在一个名为 firstValue
的分析函数,它将为我提供给定 window 的第一个非空值。我知道这存在于 Hive 中,但我无法在任何地方的 pyspark 中找到它。
鉴于 pyspark 不允许 UserDefinedAggregateFunctions (UDAF),有没有办法实现这个?
Spark >= 2.0:
first
接受一个可选的 ignorenulls
参数,它可以模仿 first_value
:
df.select(col("k"), first("v", True).over(w).alias("fv"))
Spark < 2.0:
可用函数被调用first
,可以按如下方式使用:
df = sc.parallelize([
("a", None), ("a", 1), ("a", -1), ("b", 3)
]).toDF(["k", "v"])
w = Window().partitionBy("k").orderBy("v")
df.select(col("k"), first("v").over(w).alias("fv"))
但如果您想忽略空值,则必须直接使用 Hive UDF:
df.registerTempTable("df")
sqlContext.sql("""
SELECT k, first_value(v, TRUE) OVER (PARTITION BY k ORDER BY v)
FROM df""")