You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 11 Next »

사용준비

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개 데이터 획득

import requests
import json

chkein = '2018-01-18'
stays = 1
url = 'http://mobile.dailyhotel.co.kr/api/v3/hotels/sales?dateCheckIn={}&stays={}&provinceIdx=5&areaIdx=&page=1&limit=200&persons=2&details=true'.format(chkein,stays)
r = requests.get(url)
data = r.json()
hotels=data['data']['hotelSales']

기본 사용

전체 리스트를 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)


데이터 셋을 통해 SQL문사용하기

dfHotels.createOrReplaceTempView('tblHotel')


spark.sql('select * from tblHotel').collect()


SparkData의 시각화 

Spark에서 처리된 데이터를 시각화하거나? 엑셀에 저장할때 이용합니다.

pdHotels = pd.read_json( json.dumps(rddHotels
.collect() ) )

pdHotels
addrSummaryavailableRoomscategorydiscountgradehotelIdxlatitudelongitudenameregionNamereviewCount
07hotel169900special123430.130.1메이필드호텔서울223


여기서 의미 있는 값이 무엇인지? 필드명을 파악합니다.


필요하면 엑셀로도 저장해줍니다.

pdHotels.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)
==> 결과
['중구', '강남구', '서초구', '강서구', '구로구']

사용자 알고리즘 적용

사전준비: 사용할 알고리즘 준비하기

math-util

  • 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)






  • No labels