Apache spark [Py]Spark-SQL:多列会话

Apache spark [Py]Spark-SQL:多列会话,apache-spark,pyspark,apache-spark-sql,spark-dataframe,Apache Spark,Pyspark,Apache Spark Sql,Spark Dataframe,给定一个正长i和一个数据帧 +-----+--+--+ |group|n1|n2| +-----+--+--+ | 1| 0| 0

给定一个正长
i
和一个数据帧

+-----+--+--+                                                          
|group|n1|n2|                                                              
+-----+--+--+                                                              
|    1| 0| 0|                                                              
|    1| 1| 1|                                                              
|    1| 1| 5|                                                              
|    1| 2| 2|                                                              
|    1| 2| 6|                                                              
|    1| 3| 3|                                                              
|    1| 3| 7|                                                              
|    1| 4| 4|                                                              
|    1| 5| 1|                                                              
|    1| 5| 5|                                                              
+-----+--+--+
您将如何在同一
中的行中,使会话中的每对连续行
r1
r2
r1.n1
r2.n2
r1.n2
,以及max(
r2.n1
-
r1.n1
r2.n2
?注意,
n1
n2
值可能不唯一,这意味着组成会话的行在数据帧中可能不连续

例如,给定数据帧和
i
=3的结果为

+-----+--+--+-------+
|group|n1|n2|session|
+-----+--+--+-------+
|    1| 0| 0|      1|
|    1| 1| 1|      1|
|    1| 1| 5|      2|
|    1| 2| 2|      1|
|    1| 2| 6|      2|
|    1| 3| 3|      1|
|    1| 3| 7|      2|
|    1| 4| 4|      1|
|    1| 5| 1|      3|
|    1| 5| 5|      1|
+-----+--+--+-------+

任何帮助或提示都将不胜感激。谢谢

这看起来像是您试图用相同的数字标记图形的所有连接部分。一个好的解决方案是使用
图形框架

从您的数据帧:

df=sc.parallelize([[1,0,0],[1,1,1],[1,1,5],[1,2,2],[1,2,6],
[1,3,3]、[1,3,7]、[1,4,4]、[1,5,1]、[1,5,5])。toDF([“组”、“n1”、“n2”])
我们将创建一个包含唯一
id
s列表的顶点数据框:

import pyspark.sql.函数作为psf
v=df.select(psf.struct(“n1”、“n2”)。别名(“id”),“group”)
+-----+-----+
|id |组|
+-----+-----+
|[0,0]|    1|
|[1,1]|    1|
|[1,5]|    1|
|[2,2]|    1|
|[2,6]|    1|
|[3,3]|    1|
|[3,7]|    1|
|[4,4]|    1|
|[5,1]|    1|
|[5,5]|    1|
+-----+-----+
以及根据您所述的布尔条件定义的边缘数据帧:

i=3
e=df.alias(“r1”).join(
df.别名(“r2”),
(psf.col(“r1.group”)==psf.col(“r2.group”))
&(psf.col(“r1.n1”)
现在查找所有连接的组件:

从图形框架导入*
g=图形框架(v,e)
res=g.连接的组件()
+-----+-----+------------+
|id |组|组件|
+-----+-----+------------+
|[0,0]|    1|309237645312|
|[1,1]|    1|309237645312|
|[1,5]|    1| 85899345920|
|[2,2]|    1|309237645312|
|[2,6]|    1| 85899345920|
|[3,3]|    1|309237645312|
|[3,7]|    1| 85899345920|
|[4,4]|    1|309237645312|
|[5,1]|    1|292057776128|
|[5,5]|    1|309237645312|
+-----+-----+------------+

谢谢你,玛丽。找到连接的组件就成功了!不幸的是,性能太差了——为我提供的示例找到解决方案花了一分钟多!你知道为什么会这样吗?它的迭代次数与最大分支长度相同。您可以尝试调整图表,使其运行更快。谢谢您的建议。不幸的是,即使使用图形调优,糟糕的运行时性能也会破坏我的生产数据集。