2

SparkSQLを使用してBSTを構築しようとしていますが、これはメインSELECTステートメント内の別のSELECTステートメントを使用して簡単に行うことができます。 BSTのSpark SQL:別のSELECTステートメントの列(バイナリ検索ツリー)

グラフィカルな表現は以下の通りである:

Binary Search Tree

入力BST.Goalの行 - 列表現である入力テーブルデータを用いて、出力テーブルを生成することです。

  • ルート:なし親ノードを持たない

  • インナー:親ノードだけでなく、子ノードを持つ

  • 葉:だけ親ノードと子ノードを持つ

Data

これは、選択した範囲内で選択すると簡単に実現できます。 s:

SELECT t.node, 
    CASE 
     WHEN t.parent IS NULL THEN 'root' 
     WHEN EXISTS (SELECT t1.parent FROM bst t1 WHERE t1.parent = t.node) THEN 'inner'   
     ELSE 'leaf' 
    END 
FROM bst t 

SparkSQLには上記の機能がないため、回避する必要がありました。

spark.sql("""SELECT node, 'inner' AS desc 
FROM bst t 
WHERE EXISTS (SELECT 1 
         FROM bst t1 
         WHERE t1.parent=t.node) 
      AND parent IS NOT NULL 

UNION ALL 

SELECT node,'leaf' AS desc 
FROM bst t 
WHERE NOT EXISTS (SELECT 1 
         FROM bst t1 
         WHERE t1.parent=t.node) 
      AND parent IS NOT NULL   

UNION ALL 

SELECT node,'root' AS desc 
FROM bst t 
WHERE parent IS NULL""").show() 

コマンド迅速ダミーデータ

data = \ 
    [(1, 2), 
    (3, 2), 
    (6, 8), 
    (9, 8), 
    (2, 5), 
    (8, 5), 
    (5, None)] 
df = spark.createDataFrame(data, ["node", "parent"]) 
df.createOrReplaceTempView ("bst") 

を作成するために、私は、これを行うには、他のより良い最適化された方法をスパークバージョン2.1を使用していますか?

答えて

1

自己結合を行う必要がありますが、おそらく1つのステートメント(2つのステートメントと2つのステートメントを組み合わせて)で行うことができます。ここで

が試みです:

select distinct 
    case 
    when n.parent is null then 'root' 
    when child.node is null then 'leaf' 
    else 'inner' end 
    ,n.node 
from bst n 
left outer join bst child 
on n.node = child.parent 
; 
関連する問題