반응형


Dataframe count중 scala.MatchError 발생 ( show 명령어는 정상적으로 먹는데??? )


간만에 스파크 작업을 진행하다가 다음과 같은 에러문구를 만났다.


Caused by: scala.MatchError: [Ljava.lang.String;@17f58fdb (of class [Ljava.lang.String;)


Text 파일을 sc.textFile("path") 로 읽어와 해당 RDD를 Dataframe으로 변환하고 dataframe.count시 발생하였다.



문제의 원인은  실제 텍스트파일내의 내용을 RDD로 읽어와 split으로 나눈 후 Dataframe으로 변형하는 과정에서 


컬럼개수가 일치하지 않는 데이터가 있었다.


text파일의 포맷은 다음과 같았다.


id    advid    itemid  itemName 

1       123      456      [아임닭] 닭가슴살~~~

.

.

.


이러한 RDD를 다음과 같이 Dataframe으로 만들려고 하였다.

val rawDataDF = rawData.map(_.split("\t") match { case Array(v1,v2,v3,v4) => (v1,v2,v3,v4)}).toDF(“id”, “advid”, “item_id”, “item_name”)


전혀 문제가 없을 것 같지만 이렇게 변경 후 count명령을 내려보면 MatchError가 발생하는 것이다.


알고보니 itemName에 상품명중 탭 구분자("\t")가 들어가 있었던 상품명이 있었던 것이다.



그래서 실제로는 4개의 컬럼으로 나누어져서 Dataframe이 만들어져야 하지만 상품명에 탭구분자가 있는 경우


Array length가 4이상이되면서 macth case 조건에 정상적으로 매칭되지 않았던 것이다.



이럴 경우 Dataframe을 show로 보았을 때는 전혀 문제가 없어보일 수 있지만 count로 모든 데이터의 수를 세게 될 떄


특정 데이터에 문제가 있을 경우 matchError가 발생하게 되는 것이다.




해결방법은 map처리에서 flatMap처리로 변경 후 조건에 맞지 않는 데이터는 None처리를 진행하였다.

val df = rawData.flatMap(_.split("\t") match { case Array(v1,v2,v3,v4) => Some((v1,v2,v3,v4)) case d => None}).toDF("id", "advid", "item_id", "item_name")


또 다시 같은 삽질을 하지 않기 위해 포스팅 남겨본다.

반응형

+ Recent posts