2
SparkSQL을 사용하여 BST를 작성하려고합니다.이 작업은 기본 SELECT 문에서 다른 SELECT 문을 사용하여 쉽게 수행 할 수 있지만 SparkSQL은 SELECT 열에서 SELECT를 지원하지 않습니다. BST의Spark SQL : 다른 SELECT 문의 열 (이진 검색 트리)
그래픽 표현은 아래와 같다 :
입력 BST.Goal의 행 - 열 표현 입력 테이블 데이터를 사용하여 출력 테이블을 생성하는 것이다.
루트 : 부모 노드가없는
내부 : 부모 노드뿐만 아니라 자식 노드를 가진
- 잎 : 만 부모 노드와 자식 노드를 가진
이것은 선택 내에서 선택을하면 쉽게 달성 할 수 있습니다. SQL은 아래에서해야합니다. 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,이 작업을 수행하는 다른 더 나은 최적화 된 방법을 사용하고
?