我正在使用pyspark 1.5从Hive表中获取数据并尝试使用窗口函数。
根据this,存在一个名为firstValue
的分析函数,它将为给定窗口提供第一个非空值。我知道这存在于Hive中,但我无法在pyspark中找到它。
有没有办法实现这个,因为pyspark不允许UserDefinedAggregateFunctions(UDAFs)?
答案 0 :(得分:3)
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""")