Apache spark Spark SQL—以编程方式在表上循环的最佳方式
假设我有以下spark数据帧:Apache spark Spark SQL—以编程方式在表上循环的最佳方式,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,假设我有以下spark数据帧: | Node_id | Parent_id | |---------|-----------| | 1 | NULL | | 2 | 1 | | 3 | 1 | | 4 | NULL | | 5 | 4 | | 6 | NULL | | 7 | 6 | | 8 | 3
| Node_id | Parent_id |
|---------|-----------|
| 1 | NULL |
| 2 | 1 |
| 3 | 1 |
| 4 | NULL |
| 5 | 4 |
| 6 | NULL |
| 7 | 6 |
| 8 | 3 |
此数据帧表示由多个不相交的树组成的树结构。现在,假设我们有一个节点列表[8,7],我们希望得到一个数据帧,其中只包含作为包含列表中节点的树的根的节点。输出如下所示:
| Node_id | Parent_id |
|---------|-----------|
| 1 | NULL |
| 6 | NULL |
使用spark查询和pyspark的最佳(最快)方法是什么
如果我在纯SQL中执行此操作,我只会执行以下操作:
CREATE TABLE #Tmp
Node_id int,
Parent_id int
INSERT INTO #Tmp Child_Nodes
SELECT @num = COUNT(*) FROM #Tmp WHERE Parent_id IS NOT NULL
WHILE @num > 0
INSERT INTO #Tmp (
SELECT
p.Node_id
p.Parent_id
FROM
#Tmp t
LEFT-JOIN Nodes p
ON t.Parent_id = p.Node_id)
SELECT @num = COUNT(*) FROM #Tmp WHERE Parent_id IS NOT NULL
END
SELECT Node_id FROM #Tmp WHERE Parent_id IS NULL
我只是想知道,除了使用python简单地在数据帧上循环外,是否还有一种更以spark为中心的使用pyspark的方法
parent_nodes = spark.sql("select Parent_id from table_name where Node_id in [2,7]").distinct()
您可以将上面的数据框与表连接起来,以获得这些节点的父节点id。4是根节点,不是吗?“select*where Paren_id为null”应该用于获取所有根node@SomeshwarKale这将给出1,4,6-我不想要不在表中的节点的根节点。这只适用于任何树的深度不超过两级的情况。我已经更新了这个例子,对预期的行为给出了更多的解释。