사용준비
import pyspark import requests import pandas as pd import json from pyspark.sql import SparkSession from pyspark.sql.types import * from pyspark.sql import SQLContext sc = pyspark.SparkContext('local[*]') spark = SparkSession(sc) sqlContext = SQLContext(sc)
spark 객체는 분산컴퓨팅을위해 여러개를 선택할수도 있으나, 여기서는 로컬 객체 하나만 사용하겠습니다.
spark를 설치하고 셋팅하는방법은 다양하니.. 여기서 언급하지는 않겠습니다.
여기서는 도커의 all-spark-notebook 을 이용하였습니다. - Docker 설치 참고
샘플데이터
데일리 호텔에서 200개 데이터 획득
기본 사용
전체 리스트를 Spark 병렬처리용 RDD로 변환
rddHotels = sc.parallelize(hotels)
이렇게 변환하는 이유는, 대용량 데이터의 복잡한 분산 연산처리를
스파크 API를 통해 간편하게 사용하기 위함이다.
Spark RDD를 전체 리스트로 반환
rddHotels.collect()
SparkRDD 를 데이터셋으로
schema = StructType( [ StructField('hotelIdx',LongType(),True), StructField('discount',LongType(),True), StructField('name',StringType(),True) ]) dfHotels = sqlContext.createDataFrame(rddHotels, schema)
SparkData의 시각화
Spark에서 처리된 데이터를 시각화하거나? 엑셀에 저장할때 이용합니다.
df = pd.read_json( json.dumps(hotellist_sc.collect() ) ) df
addrSummary | availableRooms | category | discount | grade | hotelIdx | latitude | longitude | name | regionName | reviewCount |
---|---|---|---|---|---|---|---|---|---|---|
0 | 7 | hotel | 169900 | special1 | 234 | 30.1 | 30.1 | 메이필드호텔 | 서울 | 223 |
여기서 의미 있는 값이 무엇인지? 필드명을 파악합니다.
필요하면 엑셀로도 저장해줍니다.
df.to_excel('output.xls', index=False)
Spark RDD 기본 API
필터-비싼호텔 찾기
expesiveHotel = rddHotels.filter( lambda row : row['discount'] > 300000 ) #전체를 다 가져오거나? expesiveHotel.collect() #특정 개수만 획득 expesiveHotel.take(5) ==> 데이터 예 [{'addrSummary': '강남 | 삼성역 도보 1분', 'availableRooms': 5, 'displayText': '서울 > 파크 하얏트 서울', 'distance': 0.0, 'districtName': '강남구',
중복제거-호텔 관리데이터 확인
grades = rddHotels.map( lambda row: row['grade'] ).distinct() grades.take(5) ==> 결과 : 해당 데이터가 관리하는 grade파악이 가능합니다. ['special1', 'special2', 'grade2', 'motel', 'design'] regions = rddHotels.map( lambda row: row['districtName'] ).distinct() regions.take(5) ==> 결과 ['중구', '강남구', '서초구', '강서구', '구로구']
사용자 알고리즘 적용
사전준비: 사용할 알고리즘 준비하기
getDistance(
52.2296756
,
21.0122287
,
52.406374
,
16.9251681
)
- edit_distance('강남호텔', '강남호텔a')
근처 호텔찾기
#서울의 어느 호텔 'latitude': 37.5700718, 'longitude': 127.0089115 nearHotel= rddHotels.filter( lambda row : 5 > getDistance(37.5700718,127.0089115,row['latitude'],row['longitude'] ) ) nearHotel.take(10) nearHotel.count()
비슷한 이름 호텔찾기
siHotel = rddHotels.filter( lambda row : 2 > edit_distance('호텔 리안 A',row['name'] ) ) siHotel.take(100)