Apache spark 用PySpark-SQL提取组数据
我已将以下数据加载到DataFrame中,如下所示Apache spark 用PySpark-SQL提取组数据,apache-spark,pyspark,Apache Spark,Pyspark,我已将以下数据加载到DataFrame中,如下所示 S.NO routename status tripcount 1 East STARTED 1 2 West STARTED 1 4 East ARRIVED 2 5 East ARRIVED 3 6 East STARTED
S.NO routename status tripcount
1 East STARTED 1
2 West STARTED 1
4 East ARRIVED 2
5 East ARRIVED 3
6 East STARTED 4
7 East STARTED 5
8 West ARRIVED 2
9 East ARRIVED 6
我只想取出以下几行
1,2,4,6,8,9
基本上开始了-到达了基地,剩下的我想跳过。现在我已经上膛了
dataframe_mysql.select("routename").distinct().show()
有了这个,我应该在lambda表达式内部循环,或者是否有其他内置方法可以帮助我获得结果。您可以使用
窗口
和滞后
函数。您可以使用fillna
、filter
和drop
函数来获得所需的结果
from pyspark.sql import functions as F
from pyspark.sql.window import Window as W
windowSpec = W.partitionBy("routename").orderBy(F.col("S_NO"))
df.withColumnRenamed("S.NO", "S_NO").withColumn("remove", F.lag("status", 1).over(windowSpec))\
.fillna({"remove":"nullString"})\
.filter(F.col("status") != F.col("remove"))\
.drop("remove")
这里,我们将窗口
函数与routename
列分组,并按S\u NO
排序S.NO
被重命名,因为它在fillna
函数之后产生了问题<代码>延迟功能将状态
从以前的状态复制到新列删除
fillna
将所有空值替换为nullString StringType,以便在过滤器中考虑它。最后,remove
列是drop
ped
如果希望对输出进行排序,可以使用其他orderBy
.orderBy("S_NO")
您应该得到如下输出:
+----+---------+-------+---------+
|S_NO|routename|status |tripcount|
+----+---------+-------+---------+
|1 |East |STARTED|1 |
|2 |West |STARTED|1 |
|4 |East |ARRIVED|2 |
|6 |East |STARTED|4 |
|8 |West |ARRIVED|2 |
|9 |East |ARRIVED|6 |
+----+---------+-------+---------+
希望答案不仅有用
更新
正如@syv所指出的,lag
具有默认值参数选项,当未找到lag
的值时,可以使用该选项,这样就可以完全删除fillna
函数调用,甚至不需要对列进行重命名
from pyspark.sql import functions as F
from pyspark.sql.window import Window as W
windowSpec = W.partitionBy("routename").orderBy(F.col("`S.NO`"))
df.withColumn("remove", F.lag("status", 1, "nullString").over(windowSpec))\
.filter(F.col("status") != F.col("remove"))\
.drop("remove")\
.orderBy(F.col("`S.NO`"))
应该给你什么
+----+---------+-------+---------+
|S.NO|routename|status |tripcount|
+----+---------+-------+---------+
|1 |East |STARTED|1 |
|2 |West |STARTED|1 |
|4 |East |ARRIVED|2 |
|6 |East |STARTED|4 |
|8 |West |ARRIVED|2 |
|9 |East |ARRIVED|6 |
+----+---------+-------+---------+
您可以使用窗口
和滞后
功能。您可以使用fillna
、filter
和drop
函数来获得所需的结果
from pyspark.sql import functions as F
from pyspark.sql.window import Window as W
windowSpec = W.partitionBy("routename").orderBy(F.col("S_NO"))
df.withColumnRenamed("S.NO", "S_NO").withColumn("remove", F.lag("status", 1).over(windowSpec))\
.fillna({"remove":"nullString"})\
.filter(F.col("status") != F.col("remove"))\
.drop("remove")
这里,我们将窗口
函数与routename
列分组,并按S\u NO
排序S.NO
被重命名,因为它在fillna
函数之后产生了问题<代码>延迟
功能将状态
从以前的状态复制到新列删除
fillna
将所有空值替换为nullString StringType,以便在过滤器中考虑它。最后,remove
列是drop
ped
如果希望对输出进行排序,可以使用其他orderBy
.orderBy("S_NO")
您应该得到如下输出:
+----+---------+-------+---------+
|S_NO|routename|status |tripcount|
+----+---------+-------+---------+
|1 |East |STARTED|1 |
|2 |West |STARTED|1 |
|4 |East |ARRIVED|2 |
|6 |East |STARTED|4 |
|8 |West |ARRIVED|2 |
|9 |East |ARRIVED|6 |
+----+---------+-------+---------+
希望答案不仅有用
更新
正如@syv所指出的,lag
具有默认值参数选项,当未找到lag
的值时,可以使用该选项,这样就可以完全删除fillna
函数调用,甚至不需要对列进行重命名
from pyspark.sql import functions as F
from pyspark.sql.window import Window as W
windowSpec = W.partitionBy("routename").orderBy(F.col("`S.NO`"))
df.withColumn("remove", F.lag("status", 1, "nullString").over(windowSpec))\
.filter(F.col("status") != F.col("remove"))\
.drop("remove")\
.orderBy(F.col("`S.NO`"))
应该给你什么
+----+---------+-------+---------+
|S.NO|routename|status |tripcount|
+----+---------+-------+---------+
|1 |East |STARTED|1 |
|2 |West |STARTED|1 |
|4 |East |ARRIVED|2 |
|6 |East |STARTED|4 |
|8 |West |ARRIVED|2 |
|9 |East |ARRIVED|6 |
+----+---------+-------+---------+
你能再解释一下你的逻辑吗?我想对每一条路线的名称分别采用“第一个开始”和“下一个第一个到达”。1 - 4, 2 - 8, 6 - 9. 如果重复相同的状态,则应跳过它。我可以按routename对其进行分组并独立执行吗?是的,肯定可以,这将使您在spark中处理足够有价值。:)很高兴你知道了,你能告诉我-当我遇到相同的状态时,如何跳过记录?我可以使用lambda内部循环或任何其他选项吗?您能再解释一下您的逻辑吗?我想为每个路由名称选择“第一个开始”和“下一个第一个到达”。1 - 4, 2 - 8, 6 - 9. 如果重复相同的状态,则应跳过它。我可以按routename对其进行分组并独立执行吗?是的,肯定可以,这将使您在spark中处理足够有价值。:)很高兴你知道了,你能告诉我-当我遇到相同的状态时,如何跳过记录?我可以使用lambda内部的循环或任何其他选项吗?谢谢,一个问题取代了.fillna({“remove”:“nullString”}),我可以使用“F.lag(“status”,1,“nullString”)吗它会填充默认值吗?我在另一个例子中尝试过,但它仍然显示为空。是的@syv这真的很好。我也不知道。自己试试看,然后学习和教别人。:)这很有效!!“F.lag(“status”,default=“nullString”)@syv是的,它有效。感谢分享知识,感谢接受和支持upvote@syv更新了更优化的答案,请看:)谢谢,一个问题代替了.fillna({“remove”:“nullString”}),我可以使用“F.lag(“status”,1,“nullString”)吗它会填充默认值吗?我在另一个例子中尝试过,但它仍然显示为空。是的@syv这真的很好。我也不知道。自己试试看,然后学习和教别人。:)这很有效!!“F.lag(“status”,default=“nullString”)@syv是的,它有效。感谢分享知识,感谢接受和支持upvote@syv更新了更优化的答案,请查看:)