본문 바로가기

소프트웨어-이야기/데이터 저장소 + 시각화

[Spark] 여러개의 로그 파일 한번에 읽어오기

제플린 노트북에서 데이터 소스를 가져올 때, DataFrameReader Class를 주로 사용한다.


아래의 코드 처럼, DataFrameReader의 함수들을 사용해서 구조화되어있는 파일을 읽어들이면 DataFrame을 리턴된다.


spark.read.json("s3n://jimin-bucket/a/*")
spark.read.parquet("s3n://jimin-bucket/a/*")



그런데 파일을 하나하나 가져오기 보다는 여러 파일리스트를 한번에 가져오고 싶을 때가 있다.

이때는 MutableList에 파일 목록들을 담아서, 이를 매개변수로 보내주면 된다.




-------------------------------------------------------------------------------------------------------------------


처음에 한번에 데이터소스를 가져오는 방법을 찾기 위해 Apache Spark API 문서 페이지에서 DataFrameReader 클래스의 json 함수의 매개변수들을 훑어보았다.



경로 : http://spark.apache.org/docs/latest/api/scala/#org.apache.spark.sql.DataFrameReader



위에서 세번째 함수인, json(paths: String*)을 통해 

파일 경로들을 가변 변수로 넘겨주면, 한 번에 여러개의 파일들을 읽어들일 수 있단걸 알게되었다.



spark.read.json("s3n://jimin-bucket/a/*","s3n://jimin-bucket/b/*")



-------------------------------------------------------------------------------------------------------------------


그러면 가변변수들을 이렇게 하나하나 지정해주는게 아니라, List에 파일 경로들을 담아서 한번에 가져올 수 있는 방법이 없나 찾아보았다.



그래서 스택오버플로우에서 List를 매개변수로 넘길 때, 가변인자로 확장시키는 방법을 찾아냈다.



링크 : http://stackoverflow.com/questions/5495428/scala-how-to-pass-an-expanded-list-as-varargs-into-a-method



-------------------------------------------------------------------------------------------------------------------


처음에는 아래처럼 그냥 List 혹은 Array에 파일 경로들을 담아서, 데이터소스를 가져오려고 했다.


var fileLlist:List[String] =List()
fileList = fileList :+ "s3n://jimin-bucket/a/*"
fileList = fileList :+ "s3n://jimin-bucket/b/*"

spark.read.json(fileList: _*)



그런데 이렇게 대입하고 fileList 값을 읽어보니, 텅텅비어있었다.


내가 겪은 기묘한 상황은 아래의 스택오버플로우 질문사항과 같았다.

( 링크 : http://stackoverflow.com/questions/19610320/add-element-to-a-list-in-scala )


이런 경우, mutable list를 사용해야한다고 한다.

내가 아무리 List에 값을 새로 추가한다고 해도, List는 값이 불변한다고 한다. ( immutable List를 사용하고 있던 셈이였다. )



-------------------------------------------------------------------------------------------------------------------



결론


아래처럼 사용하면 된다


var fileLlist:MutableList[String] = MutableList()
fileList = fileList :+ "s3n://jimin-bucket/a/*"
fileList = fileList :+ "s3n://jimin-bucket/b/*"

spark.read.json(fileList: _*)