인프런 커뮤니티 질문&답변

jihun0423님의 프로필 이미지
jihun0423

작성한 질문수

스파크 머신러닝 완벽 가이드 - Part 1

spark환경에서 데이터 수정에 관하여 질문이 있습니다.

작성

·

223

1

안녕하십니까 수업 잘 수강하고 있습니다!

수업을 수강하며 pyspark를 통해 예전에 했던 프로젝트의 데이터를 전처리부터 머신러닝까지 적용해보는 중인데, 전처리 과정에서 데이터를 수정해야 하는 경우에 대하여 질문이 있습니다.

spark의 경우 pandas처럼 바꾸고 싶은 컬럼의 값만 바꿀 수 있지가 않고, withColumn을 통해 새로운 컬럼을 만들어내는 형식으로 대체가 가능한걸로 알고 있습니다.

단순히 컬럼별로 기준을 정해서 바꾸는 거면 withColumn으로도 가능하지만, 만약 개별 줄마다 값을 변경해야 할 경우 for문을 써서 바꿔야 하는 경우가 있는데, 이렇게 할 경우 제 현재 작업 환경(로컬)이 노드가 하나여서 그런지 Java.lang.OutOfMemoryError이 뜨더군요.

그래서 기존에 하던 pandas에서 하던 것 처럼 하려면, toPandas로 바꿔서 해도 되긴 합니다만.. 그러면 pyspark를 이 단계에서는 굳이 사용해봐야 의미가 없고, 또한 나중에 in-memory에서는 처리를 하기 힘든 큰 데이터의 경우에서는 pandas를 사용하지 못하니 방법이 아예 사라지게 됩니다.

 

그래서 질문은, 만약 이 경우처럼 세세하게 한줄한줄마다 값을 수정할 필요가 있을 경우, 어떻게 하는 것이 좋을지 궁금합니다. 또, spark dataframe을 toPandas로 변환할 경우 그냥 Pandas dataframe으로 불러오는 것과 차이점이 있는지도 여쭤보고 싶습니다.

답변 1

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

기본적으로 Spark은 Row별로 데이터 처리를 선호하지 않습니다. Spark 뿐만 아니라 File System을 기반으로 Open source 빅데이터 솔루션들은 Row별 데이터 처리 기능이 제약적입니다. 이유는 여기서 말씀드리기에는 길게 설명드려야 하지만, 간략하게 요약드리면 대용량 데이터 처리를 효율적으로 수행하기 위해서는 건별 Row 처리 아키텍처를 희생해야 했기 때문입니다.

하지만 For loop 레벨로 row단위 변경을 수행할 수는 있습니다. dataframe을 rdd로 변경하여 map()을 호출하거나 foreach로 lambda를 호출하시면 됩니다. 자세한 수행 방법은 내용이 좀 있어서 여기서 설명드리는 것 보다는 직접 구글 검색을 해보시면 더 좋을 것 같습니다.

pyspark dataframe map 또는 foreach lambda로 검색해 보시면 좋을 것 같습니다.

 

감사합니다.

 

jihun0423님의 프로필 이미지
jihun0423

작성한 질문수

질문하기