미국의 $2000불 이상의 주식만 가져오기
가능한 방법은 몇가지일까?
첫번째로 생각해볼 수 있는
1. Inner Join
2. Filter by Country
3. Filter by Currency
tickers = sc.parallelize([
(1, ("Google", "GOOGL", "USA")),
(2, ("Netflix", "NFLX", "USA")),
(3, ("Amazon", "AMZN", "USA")),
(4, ("Tesla", "TSLA", "USA")),
(5, ("Samsung", "005930", "Korea")),
(6, ("Kakao", "035720", "Korea"))
])
prices = sc.parallelize([
(1, (2984, "USD")), (2, (645, "USD")),
(3, (3518, "USD")), (4, (1222, "USD")),
(5, (70600, "KRW")), (6, (125000, "KRW"))
])
# CASE 1: Join 먼저, filter 나중에
tickerPrice = tickers.join(prices)
tickerPrice.filter(lambda x: x[1][0][2] == "USA" and x[1][1][0] > 2000).collect()
# [(1, (('Google', 'GOOGL', 'USA'), (2984, 'USD'))), (3, ('Amazon', 'AMZN', 'USA'), (3518, 'USD')))]
# CASE 2: filter 먼저, join 나중에
filteredTicker = tickers.filter(lambda x:x[1][2] == "USA")
filteredPrice = prices.filter(lambda x:x[1][0] > 2000)
filteredTicker.join(filteredPrice).collect()
# [(1, (('Google', 'GOOGL', 'USA'), (2984, 'USD'))), (3, ('Amazon', 'AMZN', 'USA'), (3518, 'USD')))]
퍼포먼스는 CASE 2가 더 좋다 -> shuffling을 최소화함
매번 이런 고민을 꼭 해야할까?
스파크가 알아서 해주면 좋겠다
데이터가 구조화 되어있다면
자동으로 최적화가 가능하다
Unstructured: free form
RDD에선
Structured Data 에선
Spark SQL은 구조화된 데이터를 다룰 수 있게 해준다