[t:/]$ 지식_

파이썬 2중 리스트 flatten, explode

2019/03/28

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

써놓고 보니 별거 아니네.. 예제가 이상해 보이는 것은 기분 탓입니다.









[t:/] is not "technology - root". dawnsea, rss