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