imhamburger 님의 블로그

스파크(Spark) - 제플린으로 만든 그래프에 select box 구현하기 본문

스파크(Spark)

스파크(Spark) - 제플린으로 만든 그래프에 select box 구현하기

imhamburger 2024. 8. 21. 23:33

제플린 context select box 구현하는 방법은 공식문서를 따라하면 된다.

 

 

sql 로 구현하기

SELECT
    genreAlt, 
    COUNT(*) AS cnt
FROM ${table=movdir}
where genreAlt like '%${genreAlt}%'
GROUP BY genreAlt
ORDER BY cnt DESC 
LIMIT 10

 

결과

genreAlt 부분에 보고싶은 장르만 입력하면 된다.

 

 

"판타지"를 입력하였을 때 판타지가 포한된 장르가 나온걸 볼 수 있다.

 

 

 

근데 직접 입력하는 것이 아닌 선택박스로 바꾸고 싶다면??

SELECT
    genreAlt, 
    COUNT(*) AS cnt
FROM ${table=movdir}
where genreAlt like '%${genreAlt=드라마, 드라마|판타지|애니메이션|액션|미스터리|스릴러}%'
GROUP BY genreAlt
ORDER BY cnt DESC 
LIMIT 10

 

 

genreAlt="default값으로 들어갈 것 입력" 하고 '|' 를 이용해 선택옵션을 넣어주면 된다.

 

결과

 

 

근데 일일이 입력해주는게 번거롭다면?

 

파이썬으로 for문을 돌리면 된다!

 

 

 

파이썬 코드로 구현하기

genre = read_df.select('genreAlt').dropDuplicates().rdd.map(lambda x: x[0]).collect()
gs = []
for n in genre:
    for s in n.split(','):
        gs.append((s, s))


n = z.select("select_1", sorted(list(set(gs))))

r = spark.sql(f"""
SELECT genreAlt, COUNT(*) AS cnt FROM movdir
WHERE genreAlt IS NOT NULL AND genreAlt LIKE '%{n}%'
GROUP BY genreAlt
ORDER BY cnt DESC 
LIMIT 10
""")

z.show(r)

 

1. genre=

  • read_df.select('genreAlt'): read_df 데이터 프레임에서 'genreAlt'라는 열만 선택
  • dropDuplicates(): 선택된 열에서 중복된 값을 제거합니다. 즉, 'genreAlt' 열에서 중복된 값을 제거한 새로운 데이터 프레임을 생성
  • rdd: DataFrame을 RDD로 변환
  • map(lambda x: x[0]): 각 행에서 첫 번째 요소(즉, 'genreAlt'의 값)를 추출
  • collect(): RDD의 모든 요소를 리스트 형태로 수집하여 드라이버 프로그램으로 가져온다. 이로 인해 genre에는 고유한 genreAlt 값들이 리스트로 저장된다.

2. 저장된 리스트를 for문을 돌려 gs 리스트에 튜플형태로 넣는다.

  • 각 개별 장르(s)를 튜플로 만들어 gs 리스트에 추가
  • 예를 들어, "액션"이 s이면, ("액션", "액션") 튜플이 gs 리스트에 추가

여기서 왜 굳이 ("액션", "액션") 로 묶어서 gs에 저장해야할까?

처음엔 gs.append(s)를 사용하였었는데... 아래와 같이 글씨들이 다 잘라져 나왔다.

 

정확한 이유는 모르겠지만...

gs.append(s)은 문자열이 개별적으로 추가되고, GUI 환경이 이를 세로로 표시한 결과일 가능성이 크다고 한다.

예를 들어, 특정 환경에서는 문자열의 각 문자가 별도의 텍스트 블록으로 인식되어 세로로 나열될 수 있다.

 

gs.extend((s,s))을 사용해도 gs.append(s)와 같은 결과가 나왔다..

 

따라서, 튜플로 묶어서 저장해야 한다.

 

 

3. n = z.select("select_1", sorted(list(set(gs)))):

  • 중복이 제거된 장르 리스트를 "select_1"이라는 이름을 가진 컬럼으로 가져와 select

4. sql문에서 n을 컬럼으로써 사용

 

결과