강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của 947778832
947778832

câu hỏi đã được viết

Từ cơ bản đến nâng cao Python do kỹ sư Silicon Valley giảng dạy

파이썬 data insert to table

Đã giải quyết

Viết

·

189

·

Đã chỉnh sửa

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

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

python알고리즘

Câu trả lời 2

0

altoformula님의 프로필 이미지
altoformula
Người chia sẻ kiến thức

안녕하세요 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. 효율적인 코드 작성:

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

참고 링크

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

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

Hình ảnh hồ sơ của 947778832
947778832

câu hỏi đã được viết

Đặt câu hỏi