우선 csv 파일 읽어서 mongoDB 에 insert 하는 것부터.
- 기본(?) 방식
import pandas as pd
from pymongo import MongoClient
data = pd.read_csv('movie_data.csv')
data.reset_index(inplace=True)
data_dict = data.to_dict("records")
client = MongoClient()
db = client['testdb']
collection = db['movies']
collection.insert_many(data_dict)
- odo 이용
from pymongo import MongoClient
from odo import odo
import pandas as pd
data = pd.read_csv('movie_data.csv')
client = MongoClient()
db = client['testdb']
odo(data, db.movies)
실행하니 odo 에서 몇가지 에러가 발생했다. 에러 해결 절차 아래 간단 요약.
1. tslib 문제
AttributeError: module 'pandas' has no attribute 'tslib'
찾아보니 pandas 버전업하면서 tslib 모듈 deprecated 된 것 때문인데 이로인해 문제 발생하는 라이브러리가 꽤 있는듯.
역시나 stack overflow 참고해서 site-packages\odo\backends\pandas.py 에서 아래 부분을 수정
변경 전 : @convert.register((pd.Timestamp, pd.Timedelta), (pd.tslib.NaTType, type(None)))
변경 후 : @convert.register((pd.Timestamp, pd.Timedelta), (type(pd.NaT), type(None)))
2. DiGraph 문제
tslib 에러는 발생하지 않지만 아래 에러가 새로 발생한다.
AttributeError: 'DiGraph' object has no attribute 'edge'
odo 가 NetworkX >=2.0 에서는 동작하지 않아서 NetworkX 다운그레이드로 해결했다는 답변들 있길래 시도해봤다.
pip uninstall networkx
pip install networkx==1.11
여기까지 하고 나니 에러 없이 정상 동작.
기본 방식이나 odo 이용한거나 수행 시간은 별 차이 없어보이는데 응용면에서 어떤게 나을지 좀 더 고민해보기로 하고, 다음 테스트로 mongoDB 에서 데이터 읽는거 시도.
- pymongo 와 pandas 이용한 기본(?) 방식
import pandas as pd
from pymongo import MongoClient
db = MongoClient()
df = pd.DataFrame.from_records(db.testdb.movie.find())
- pdmongo 이용
import pdmongo as pdm
df = pdm.read_mongo("movie", [], "mongodb://localhost:27017/testdb")
- odo 이용
import pandas as pd
from odo import odo
data = odo('mongodb://localhost/testdb::movie', pd.DataFrame)
원래대로면 이것도 당연히 tslib 에러 나겠지만 앞에서 수정한 것 때문에 정상 작동.
테스트한 데이터가 대략 64M 에 5만건인데 실 적용해보려는 데이터셋은 이보다 훨씬 클거라 예상되는 상황이라 좀 더 나은 해법이 필요하지 않을까 싶어서 blaze 가 도움이 될까 시도해봤지만 ...
현재 설정 상태에서 blaze 이용하면 'psutil._psutil_windows' 관련 에러가 난다.
ModuleNotFoundError: No module named 'psutil._psutil_windows'
이 에러 관련해서는 구글링해봤지만 딱히 명확한 답이 보이지 않고 시도해볼 수 있는 방법은 당장은 blaze 의존성 있는 라이브러리의 버전을 다운그레이드하는거. 이렇게까지 해서 얻을 수 있는 효과가 의미가 있을까 고민 중.
'Lang' 카테고리의 다른 글
APScheduler 스케쥴링을 동적으로 제어하는 방법 (0) | 2020.09.21 |
---|---|
MS Azure Blob Storage 에 json 데이터 업로드 (0) | 2020.09.11 |
Armeria, gRPC, JPA 간단한 샘플 (2) | 2020.08.19 |
[python]cx_oracle 설정, 사용 예 (0) | 2020.07.28 |
[Python]두 DB 간 테이블 동기화 코딩 (0) | 2020.07.21 |