sparksql-以编程方式在表上循环的最佳方式

mqxuamgl  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(698)

假设我有以下sparkDataframe:

| Node_id | Parent_id |
|---------|-----------|
| 1       | NULL      |
| 2       |  1        |
| 3       | 1         |
| 4       | NULL      |
| 5       | 4         |
| 6       | NULL      |
| 7       | 6         |
| 8       | 3         |

这个Dataframe表示由几个不相交的树组成的树结构。现在,假设我们有一个节点列表[8,7],我们想要得到一个Dataframe,其中只包含节点,这些节点是包含列表中节点的树的根

| 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简单地在Dataframe上循环之外,是否还有一种更为以spark为中心的方法来使用pyspark实现这一点。

jdg4fx2g

jdg4fx2g1#

parent_nodes = spark.sql("select Parent_id from table_name where Node_id in [2,7]").distinct()

您还可以将上面的Dataframe与表连接起来,以获取这些节点的父节点标识。

相关问题