[PySpark] 텍스트 파일

Thomas Dramab과 Denny Lee의 “Learning PySpark”를 보면서 학습 과정을 기록한 기록입니다♪


1. 텍스트 파일 불러오기

VS14MORT 파일을 다운로드합니다.

다운로드 주소는 http://tomdrabas.com/data/VS14MORT.txt.gz 다운로드가 즉시 재개됩니다.

다운로드 후 압축 해제

SparkContext의 textFile 함수를 사용하여 텍스트 파일을 로드합니다.

data_from_file = sc.textFile('/Users/hayeon/Downloads/VS14MORT.txt', 4)

경로 뒤의 숫자 4는 데이터 세트가 분할된 파티션의 수를 의미합니다.

첫 번째 행을 살펴보겠습니다.

>>> data_from_file.take(1)


흠, 그것은 매우 복잡해 보인다.

2. 목록으로 변환

가독성을 위해 각 값을 목록으로 표현해 보겠습니다.

헬러

행을 읽을 수 있는 형식으로 구문 분석하는 코드

이 코드는 각 행을 개별적으로 구문 분석하고 반환합니다.

>>> def extractInformation(row):
...     import re
...     import numpy as np
...     selected_indices = (
...          2,4,5,6,7,9,10,11,12,13,14,15,16,17,18,
...          19,21,22,23,24,25,27,28,29,30,32,33,34,
...          36,37,38,39,40,41,42,43,44,45,46,47,48,
...          49,50,51,52,53,54,55,56,58,60,61,62,63,
...          64,65,66,67,68,69,70,71,72,73,74,75,76,
...          77,78,79,81,82,83,84,85,87,89
...     )
...     record_split = re.compile(
...              r'((\s){19})((0-9){1})((\s){40})((0-9\s){2})((0-9\s){1})((0-9){1})((0-9){2})' + 
...              r'((\s){2})((FM){1})((0-9){1})((0-9){3})((0-9\s){1})((0-9){2})((0-9){2})' + 
...             r'((0-9){2})((0-9\s){2})((0-9){1})((SMWDU){1})((0-9){1})((\s){16})((0-9){4})' +
...             r'((YNU){1})((0-9\s){1})((BCOU){1})((YNU){1})((\s){34})((0-9\s){1})((0-9\s){1})' +
...             r'((A-Z0-9\s){4})((0-9){3})((\s){1})((0-9\s){3})((0-9\s){3})((0-9\s){2})((\s){1})' + 
...             r'((0-9\s){2})((A-Z0-9\s){7})((A-Z0-9\s){7})((A-Z0-9\s){7})((A-Z0-9\s){7})' + 
...              r'((A-Z0-9\s){7})((A-Z0-9\s){7})((A-Z0-9\s){7})((A-Z0-9\s){7})((A-Z0-9\s){7})' + 
...             r'((A-Z0-9\s){7})((A-Z0-9\s){7})((A-Z0-9\s){7})((A-Z0-9\s){7})((A-Z0-9\s){7})' + 
...              r'((A-Z0-9\s){7})((A-Z0-9\s){7})((A-Z0-9\s){7})((A-Z0-9\s){7})((A-Z0-9\s){7})' + 
...             r'((A-Z0-9\s){7})((\s){36})((A-Z0-9\s){2})((\s){1})((A-Z0-9\s){5})((A-Z0-9\s){5})' + 
...             r'((A-Z0-9\s){5})((A-Z0-9\s){5})((A-Z0-9\s){5})((A-Z0-9\s){5})((A-Z0-9\s){5})' + 
...              r'((A-Z0-9\s){5})((A-Z0-9\s){5})((A-Z0-9\s){5})((A-Z0-9\s){5})((A-Z0-9\s){5})' + 
...              r'((A-Z0-9\s){5})((A-Z0-9\s){5})((A-Z0-9\s){5})((A-Z0-9\s){5})((A-Z0-9\s){5})' + 
...               r'((A-Z0-9\s){5})((A-Z0-9\s){5})((A-Z0-9\s){5})((\s){1})((0-9\s){2})((0-9\s){1})' + 
...             r'((0-9\s){1})((0-9\s){1})((0-9\s){1})((\s){33})((0-9\s){3})((0-9\s){1})((0-9\s){1})')
...     try:
...              rs = np.array(record_split.split(row))(selected_indices)
...     except:
...             rs = np.array(('-99') * len(selected_indices))
...     return rs

https://github.com/drabastomek/learningPySpark/blob/master/Chapter02/LearningPySpark_Chapter02.ipynb

GitHub – drabastomek/learningPySpark: 학습 PySpark 책을 위한 코드베이스(준비 중)

PySpark 책 코드 베이스 학습(준비 중) – GitHub – drabastomek/learningPySpark: PySpark 책 코드 베이스 학습(준비 중)

github.com

PySpark를 학습하기 위한 코드가 업로드될 Github 주소입니다.

위의 파싱 기능은 Github에 있으니 한번 보시고 참고하시기 바랍니다.

※ 위와 같이 일반 Python 함수를 선언하면 Spark가 Python 인터프리터와 JVM 사이를 끊임없이 전환해야 하므로 애플리케이션 속도가 느려질 수 있습니다. 따라서 가능하면 내장된 Spark 함수를 사용하는 것이 좋습니다.

나. 파싱 결과 확인

>>> data_from_file_conv = data_from_file.map(extractInformation)

>>> data_from_file_conv.take(1)


아 변환 전 데이터와 비교해보면

띄엄띄엄 써져있던 날짜들 사이에 공백이 정말 많았어요!