2

SparkSQL을 사용하여 BST를 작성하려고합니다.이 작업은 기본 SELECT 문에서 다른 SELECT 문을 사용하여 쉽게 수행 할 수 있지만 SparkSQL은 SELECT 열에서 SELECT를 지원하지 않습니다. BST의Spark SQL : 다른 SELECT 문의 열 (이진 검색 트리)

그래픽 표현은 아래와 같다 :

Binary Search Tree

입력 BST.Goal의 행 - 열 표현 입력 테이블 데이터를 사용하여 출력 테이블을 생성하는 것이다.

  • 루트 : 부모 노드가없는

  • 내부 : 부모 노드뿐만 아니라 자식 노드를 가진

  • 잎 : 만 부모 노드와 자식 노드를 가진

Data

이것은 선택 내에서 선택을하면 쉽게 달성 할 수 있습니다. 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,이 작업을 수행하는 다른 더 나은 최적화 된 방법을 사용하고

?

답변

1

자기 조인을해야하지만, 하나의 명령문 (대개 두 개의 명령문이 결합 된 상태)으로 수행 할 수 있습니다.

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 
; 
: 여기

는 시도이다