代码之家  ›  专栏  ›  技术社区  ›  Sai

pyspark sqlfunction expr函数没有按预期工作?

  •  0
  • Sai  · 技术社区  · 8 年前

    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未按预期工作。

    如果 p pr 和我的一样 falg 'R' .

    如果 第页 一些价值和 公共关系 是空的,我的 flag 'N'

    如果 第页 为空并且 公共关系 我的旗帜有价值吗 '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 回复  |  直到 8 年前
        1
  •  2
  •   Ramesh Maharjan    8 年前

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

    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()

    我希望答案对你有帮助