pyspark sqlfunction expr函数无法按预期运行?

时间:2018-07-25 07:16:35

标签: apache-spark dataframe pyspark apache-spark-sql pyspark-sql

pyspark sqlfunction expr无法正常工作。

我的test1.txt包含

101|10|4
101|12|1
101|13|3
101|14|2

我的test2.txt包含

101|10|4
101|11|1
101|13|3
101|14|2

我已经使用上面的数据(如下面的代码)创建了两个数据框。

df3 = spark.createDataFrame(sc.textFile("C://Users//cravi//Desktop//test1.txt").map( lambda x: x.split("|")[:3]),["cid","pid","pr"])
    df4 = spark.createDataFrame(sc.textFile("C://Users//cravi//Desktop//test2.txt").map( lambda x: x.split("|")[:3]),["cid","pid","p"])
    df5=df4.withColumnRenamed("p", "p")\
            .join(df3.withColumnRenamed("pr", "Pr")\
            , ["cid", "pid"], "outer")\
            .na.fill(0)
    tt=df5.withColumn('flag', sf.expr("case when p>0 and pr=='null' then 'N'\
                                                        when p=0 and Pr>0 then 'D'\
                                                        when p=Pr then 'R'\
                                                        else 'U' end"))
    tt.show()

我得到如下输出

+---+---+----+----+----+
|cid|pid|   p|  Pr|flag|
+---+---+----+----+----+
|101| 14|   2|   2|   R|
|101| 10|   4|   4|   R|
|101| 11|   1|null|   U|
|101| 12|null|   1|   U|
|101| 13|   3|   3|   R|
+---+---+----+----+----+

pyspark sqlfunction expr无法正常工作。

如果ppr相同,那么我的falg将是'R'

如果p为某个值,而pr为空,则我的flag将为'N'

如果p为空并且pr是某个值,我的标志为'D'

其他情况下,我的标志是'U'

在这种情况下,预期输出为:

+---+---+----+----+----+
|cid|pid|   p|  Pr|flag|
+---+---+----+----+----+
|101| 14|   2|   2|   R|
|101| 10|   4|   4|   R|
|101| 11|   1|null|   N|
|101| 12|null|   1|   D|
|101| 13|   3|   3|   R|
+---+---+----+----+----+

1 个答案:

答案 0 :(得分:2)

isNullisNotNull 内置函数应该可以解决您的问题,该问题可以在查询中用作

tt=df5.withColumn('flag', sf.expr("case when isNotNull(`p`) and isNull(`pr`) then 'N'\
                                                        when isNull(`p`) and isNotNull(`Pr`) then 'D'\
                                                        when p=Pr then 'R'\
                                                        else 'U' end"))

因此您应该得到

+---+---+----+----+----+
|cid|pid|   p|  Pr|flag|
+---+---+----+----+----+
|101| 14|   2|   2|   R|
|101| 10|   4|   4|   R|
|101| 11|   1|null|   N|
|101| 12|null|   1|   D|
|101| 13|   3|   3|   R|
+---+---+----+----+----+

注意: na.fill(0)是无用的,因为列为StringType()

,因此未应用

我希望答案会有所帮助