강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

hunter님의 프로필 이미지
hunter

작성한 질문수

실리콘밸리 엔지니어가 가르치는 파이썬 기초부터 고급까지

파이썬 data insert to table

해결된 질문

작성

·

92

·

수정됨

0

안녕하세요

스프레드에 있는 데이터 불러와서 하이브 테이블로 data insert 해주는 구문 작성했는데요ㅠ

컬럼 9개에 데이터 로우는 5,000개 정도인데 1시간이 넘도록 반도 안들어가고 너무 느립니다 ㅠ

뭔가 문제가 있는 것 같은데 제가 짠 코드에서 잘못된 부분이 있을까요?

컬럼 6개에 데이터 로우 500개로 테스트했을땐 1초만에 모두 들어갔는데 컬럼 개수 문제인건지.. 모르겠습니다

 

# Get Raw List
backsheet = gc.open_by_url("시트 링크 입력")
list1 = backsheet.worksheet('py_hc').get_all_values()

list2 = pd.DataFrame(list1[1:], columns=list1[0])

data = []

for i in range(len(df_hc_list)):
    value = df_hc_list.loc[i]
    values = [
        str(value['a']),
        str(value['b']),
        str(value['v']),
        str(value['d']),
        str(value['e']),
        str(value['f']),
        str(value['g']),
        str(value['h']),
        str(value['i'])
    ]
    data.append(values)



query = """insert into table values (%s, %s, %s, %s, %s, %s, %s, %s, %s)"""
cursor.executemany(query, data)
connection.commit()

cursor.close()
connection.close()

어떤게 속도가 느리게 들어가게하는 원인인지 모르겠습니다 ㅠ

답변 2

0

미쿡엔지니어님의 프로필 이미지
미쿡엔지니어
지식공유자

안녕하세요 hunter님,

현재 코드에서는 executemany()를 사용해 Hive 테이블에 한 줄씩 데이터를 삽입하고 있습니다. 한 줄씩 삽입하는 방식(INSERT INTO VALUES)은 비효율적이며, 파일 단위로 한 번에 적재하는 것이 훨씬 빠릅니다. executemany() 대신 데이터를 CSV 또는 Parquet 파일로 저장한 후, Hive에 로드하는 방식이 더 적절합니다. 그리고 Google Sheets 데이터를 CSV로 변환하여 로드하는 것이 훨씬 빠를 수 있습니다 - get_all_values()는 전체 데이터를 한 번에 가져오므로 데이터가 많을 경우 속도가 느려집니다.

 

흠... 마지막으로 df.loc[i]를 사용한 반복문은 매우 비효율적이며, 성능을 크게 저하시킵니다. itertuples()을 사용하면 속도가 훨씬 빨라집니다.

data = [
    (row.a, row.b, row.v, row.d, row.e, row.f, row.g, row.h, row.i)
    for row in df_hc_list.itertuples(index=False)
]

근데, 제가 하이브를 여기서 가르쳐드렸나요? 기억이...

0

안녕하세요, 인프런 AI 인턴입니다. hunter님.

현재 스프레드시트에서 데이터를 불러와 하이브 테이블에 데이터를 삽입하는 과정에서 속도가 느린 문제가 발생하고 있는 것 같군요. 데이터 삽입 시 느린 원인은 여러 가지가 있을 수 있으며, 다음과 같은 내용을 확인해 보시는 것을 권장드립니다.

문제점 및 해결 방안

  1. 데이터 크기와 변환:

    • 각각의 데이터 행을 개별적으로 str()로 변환하는 과정이 추가적인 시간 소요를 일으킬 수 있습니다.
    • 가능한 경우, 데이터 타입 변환 과정을 최소화하는 방향을 고려해 보세요.
  2. 데이터베이스 삽입 방식:

    • executemany 함수는 적절한 방법이긴 하지만, 데이터베이스에 따라 대량 데이터 삽입 성능에 차이가 있습니다. 배치 크기를 조절해 보거나, 필요한 경우 더 대량 데이터 처리에 적합한 다른 방법(예: bulk insert)을 사용해보세요.
  3. 연결 성능 문제:

    • 데이터베이스와의 연결 설정이나 네트워크 속도 문제일 수 있습니다. 네트워크 상태나 데이터베이스의 성능 설정을 확인하시길 바랍니다.
  4. 하드웨어 한계:

    • 특정 하드웨어 환경에서는 메모리나 처리 능력의 제한 때문에 삽입 속도가 저하될 수 있습니다.
  5. 효율적인 코드 작성:

    • 현재 코드를 실행할 때 별도의 스레드나 병렬 처리를 사용해 볼 수 있습니다.

참고 링크

이와 같은 방법을 시도해 보시고, 다른 문제가 있다면, 구체적인 에러 메시지나 상황을 첨부해 주시면 더 나은 해결책을 제공할 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

hunter님의 프로필 이미지
hunter

작성한 질문수

질문하기