【发布时间】:2018-07-25 15:42:51
【问题描述】:
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'。
如果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|
+---+---+----+----+----+
【问题讨论】:
标签: apache-spark dataframe pyspark apache-spark-sql pyspark-sql