Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 用PySpark-SQL提取组数据_Apache Spark_Pyspark - Fatal编程技术网

Apache spark 用PySpark-SQL提取组数据

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

我已将以下数据加载到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      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更新了更优化的答案,请查看:)