ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 엘라스틱 클라우드에 엑셀파일 데이터 저장하기 (with 파이썬)
    공부/Elasticsearch 2022. 10. 11. 16:48

    엘라스틱 클라우드에 인덱스를 만들고 엑셀 파일 데이터를 집어넣어 보자

     

     

     

    엘라스틱 클라우드 회원 가입

    엘라스틱 클라우드는 처음 회원가입하면 14일 동안은 무료로 사용 가능하다. 

    엘라스틱 클라우드에 로그인 후 Deployment 생성 해보자 (엘라스틱 클라우드 시작하기 참고)  

     

     

    데이터 준비

    필자는 도서관정보나루에서 서울 도서관 333 개관에 소장 중인 도서 1700만 개의 데이터를 엑셀로 다운로드하였다.

     

     

    환경 준비

    엑셀 파일 데이터를 인덱스 안에 집어넣기 위해 파이썬을 사용할 생각이다. 
    파이썬은 구글 코랩(Google Colab)을 사용할 생각이기에 엑셀 파일은 모두 구글 드라이브에 저장시켜두자

     

     

     

    파이썬 코드 설명

    코랩 구글 드라이브 연결

    from google.colab import drive
    drive.mount('/content/drive', force_remount=True)

    코랩을 구글 드라이브와 연결시켜 엑셀 파일을 열 수 있게 하였다.

     

     

    드라이브에 있는 엑셀 파일 이름 가져오기

    import os
    from unicodedata import normalize
    
    path = "/content/drive/MyDrive/App Search/도서관 엑셀/" #엑셀파일의 위치
    file_list = os.listdir(path)
    
    #엑섹파일 제목의 자음모음 분리 현상을 해결 시켜줌
    file_list_py = [normalize('NFC', file) for file in file_list] 
    file_list_py.sort() #가나다 순으로 정렬
    
    print(len(file_list_py))
    print(file_list_py)

    엑셀 파일의 이름 file_list_py에 저장하였다. 

    도서관정보나루에 엑셀 파일 이름들이 자음 모음 분리 현상이 일어났고 normalize을 사용하여 해결하였다. (해결 링크)

     

     

    엘라스틱 라이브러리 다운로드하기

    pip install elasticsearch

    엘라스틱에 데이터를 보내기 위해 pip를 사용해 엘라스틱 라이브러리를 다운로드하였다.

     

     

    엘라스틱 클라우드와 연결 확인

    from elasticsearch import Elasticsearch
    
    ELASTIC_PASSWORD = "엘라스틱 패스워드"
    
    CLOUD_ID = "엘라스틱 클라우드 아이디 값"
    
    client = Elasticsearch(
        cloud_id = CLOUD_ID,
        basic_auth = ("사용자 이름", ELASTIC_PASSWORD)
    )
    
    client.info()

    엘라스틱 클라우드와 연결을 시켜 데이터를 전송할 수 있게 하자

     

     

    엘라스틱 클라우드에 인덱스에 데이터 전송

    from elasticsearch import helpers #나중에 판다 써보자
    index_name = "library" #인덱스 이름
    id = 0
    for file_name in file_list_py:
      excel_path = '‪/content/drive/MyDrive/App Search/도서관 엑셀/' + file_name + '.xlsx'
      excel_path = excel_path[1:]
    
      #엑셀 파일 열기
      wb = xlrd.open_workbook(excel_path)
      sh = wb.sheet_by_index(0)
    
      #엑셀파일 데이터를 json 리스트 형식으로 바꿈
      data_list = []
      for rownum in range(1, sh.nrows): #sh.nrows
          data = {}
          row_values = sh.row_values(rownum)
          
          #가끔 제목이 비어있는 경우가 있다
          #비어있는 경우 건너뛴다.
          if row_values[1] == '':
            continue
            
          data['book_name'] = row_values[1] # 도서명
          data['authors'] = row_values[2]   # 저자
          data['publisher'] = row_values[3] # 출판사
          
           
          data['isbn13'] = row_values[5]    # 도서의 isbn
          data['vol'] = row_values[8]       # 도서의 권
          
          #출판년도와 분류번호 또한 잘못된 값이 존재해 오류 처리를 해주었다.
          if row_values[9].isdigit():
            data['class_num'] = row_values[9] #분류번호
          if row_values[4].isdigit() and len(str(int(row_values[4]))) == 4:
            data['publication_year'] = int(row_values[4]) # 출판년도
            
          data['library_name'] = file_name #도서관이름
          
          id +=1
          data_list.append(doc)
      print(file_name+" 전송을 시작합니다."+"사이즈 [",len(data_list),"]")
    
      #500개씩 데이터를 인덱스에 전송한다.
      n = 0
      number = len(data_list)//500
      if len(data_list)%500 > 0:
        number += 1
    
      for i in range(number): 
        if i == number:
          helpers.bulk(client, data_list[n:])#client.index_documents(engine_name, data_list[n:])
          break
        #print(data_list[n:n+100])
        helpers.bulk(client, data_list[n:n+500])#client.index_documents(engine_name, data_list[n:n+100])
        n += 500
      print(file_name + " 이 완료 되었습니다. "+"[",id," ]")
      print()

    실행을 시키면 데이터양이 커서인지 대략 2시간 30분만에 완료된는 걸 확인할 수 있다.

     

    전체 코드 링크

    추후에 깃허브에 다시 한번 정리해서 올리도록 하겠다.

     

     

     

    결과

    엘라스틱 클라우드 인덱스에 가보면 데이터가 잘 들어간 것을 확인할 수 있다.

     

     

    '공부 > Elasticsearch' 카테고리의 다른 글

    엘라스틱 클라우드 시작하기  (0) 2022.10.30

    댓글

Tistory.