spark, rdd 작업을 하는데 있어서, 입력 데이터가 이렇다.
법사위 | 1,2,3 | 20130313
그런데 1,2,3 는 각각 다음과 같이 매핑되어 있다.
문자열이지만 따옴표 등은 생략한다.
sys_tcs = { 1 : [김, 학, 의], 2 : [박, 영, 선], 3: [황, 교, 안] }
이걸 맵핑하면서 full explode 하고 싶은데 한 큐에 뽑고 싶다능거.
tr_rdd = tr_df.rdd.flatMap(lambda row: [
( hash(row.uid), (tc, row.timestamp) )
for tcs in map(lambda trait:
sys_tcs.get(int(trait), []),
row.trait_ids.split(','))
for tc in tcs ])
설명을 해보면...
split에서 배열이 생성된다.
이 배열을 map으로 돌면서 매핑을 참조하면 배열로 구성된 배열이 된다.
즉, [[김, 학, 의], [박, 영, 선], [황, 교, 안]]
이것을 이중 for 루프로 돌리고 flatMap을 하면 full explode가 됩니다.
그러면 결과는 이렇게 됩니다.
법사위 | 김 | 20130313
법사위 | 학 | 20130313
법사위 | 의 | 20130313
법사위 | 박 | 20130313
법사위 | 영 | 20130313
법사위 | 선 | 20130313
법사위 | 황 | 20130313
법사위 | 교 | 20130313
법사위 | 안 | 20130313
써놓고 보니 별거 아니네.. 예제가 이상해 보이는 것은 기분 탓입니다.