2
SparkSQLを使用してBSTを構築しようとしていますが、これはメインSELECTステートメント内の別のSELECTステートメントを使用して簡単に行うことができます。 BSTのSpark SQL:別のSELECTステートメントの列(バイナリ検索ツリー)
グラフィカルな表現は以下の通りである:
入力BST.Goalの行 - 列表現である入力テーブルデータを用いて、出力テーブルを生成することです。
ルート:なし親ノードを持たない
インナー:親ノードだけでなく、子ノードを持つ
- 葉:だけ親ノードと子ノードを持つ
これは、選択した範囲内で選択すると簡単に実現できます。 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を使用していますか?