imhamburger 님의 블로그
스파크(Spark) - 제플린으로 만든 그래프에 select box 구현하기 본문
제플린 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을 컬럼으로써 사용
결과
'스파크(Spark)' 카테고리의 다른 글
스파크(Spark) - JSON파일을 읽어와 아파치스파크에서 파싱하기 (0) | 2024.08.20 |
---|---|
스파크(Spark) - 분산 처리 시스템 구조 이해하기 (0) | 2024.08.14 |
Apache Zeppelin process died 오류, Zeppelin 포트번호 변경하기 (0) | 2024.08.09 |