Inflearn brand logo image

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

hodoldol님의 프로필 이미지
hodoldol

작성한 질문수

실리콘밸리 데이터 리더가 알려주는 Airflow 기초

yfinance로 주식 데이터 읽어오기: 전체 업데이트 - 실습 포함

섹션 8 yfinance 강의 수강 중 발생한 오류

작성

·

100

1

안녕하세요, 데이터 엔지니어에 관심을 가지고 이제 막 공부를 시작한 학생입니다.

섹션 8 yfinance 첫 번째 강의를 수강하던 도중에 에러가 생겨서 문의 남깁니다.

작성되어 있는 코드 중에

extract(symbol) >> load(file_path, symbol, schema, table)

이 부분에서 문제가 생겼었습니다.
그래서

    file_path = extract(symbol)

    extract(symbol) >> load(file_path, schema, table)

이렇게 수정해서 오류를 해결했는데, airflow web ui에서 다른 오류가 발생했길래 또 찾아보니 load함수에서 문제가 생긴 것 같습니다. file_path를 load함수에서도 다시 만들어줘서 snowflake에 데이터를 적재할 때 올바른 파일 경로를 찾지 못해서 생기는 오류가 발생하는거 같아요.

def load(file_path, schema, table):
    cur = util.return_snowflake_conn("snowflake_conn")

    try:
        cur.execute(f"USE SCHEMA {schema};")
        cur.execute(
            f"""CREATE TABLE IF NOT EXISTS {table} (
            date date, 
            open float, 
            close float, 
            high float, 
            low float, 
            volume int, 
            symbol varchar
        )"""
        )

        cur.execute("BEGIN;")
        delete_sql = f"DELETE FROM {table}"
        logging.info(delete_sql)
        cur.execute(delete_sql)

        # 바로 받은 file_path 사용 (더 이상 경로 재생성 X)
        util.populate_table_via_stage(cur, table, file_path)
        cur.execute("COMMIT;")
    except Exception as e:
        cur.execute("ROLLBACK;")
        raise e
    finally:
        file_name = os.path.basename(file_path)
        table_stage = f"@%{table}"
        cur.execute(f"REMOVE {table_stage}/{file_name}")
        cur.close()

요렇게 변경해주니까 데모 영상에 나온 것과 같이 똑같이 스노우플레이크에 잘 적재되었습니다.!
제가 제대로 해결한게 맞을까요??

답변 2

1

한기용님의 프로필 이미지
한기용
지식공유자

굉장히 진도가 빠르시네요. 문제를 알려주셔서 감사드립니다.

extract(symbol) >> load(file_path, symbol, schema, table)

위 코드의 원래 의도는 file_path가 없이 아래처럼 호출하는 거였는데 GitHub에 그걸 제가 최종 반영하지 못했습니다.

extract(symbol) >> load(symbol, schema, table)

원래 의도는 file_path를 주고 받지 말고 extract와 load 함수 각각이 동일한 방법으로 file_path를 계산해서 쓰려는 거였습니다 (airflow 커맨드 실행으로 태스크별 실행하면서 디버깅할 때 편의성을 위해 tasks들간의 의존도를 최대한 줄인다는 측면에서). 일단 GitHub에서는 이 방법으로 위 코드에서 load 함수 호출시 file_path를 삭제했습니다.

하지만 하신 것처럼 수정하셔도 문제 없습니다. 코드 간의 file_path의 관계가 더 명확히 보인다는 점이 이 방식의 장점이고 단점은 airflow tasks test YfinanceToSnowflake_fullrefresh load 형태로 커맨드라인에서 테스트를 못한다는 것입니다. 강의에서 이 부분을 설명하려 했는데 명확했는지는 모르겠습니다. 아주 잘 하셨습니다!

다시 한번 알려주셔서 감사드리고 GitHub 코드는 변경했습니다. 또 다른 질문이나 문제가 생기면 포스팅해주세요!

hodoldol님의 프로필 이미지
hodoldol
질문자

넵 답변해주셔서 감사드립니다.!! 강의도 너무 잘 듣고 있습니다~~

0

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

우선 데이터 엔지니어링에 흥미를 가지시고 공부를 시작하신 것을 환영합니다! 강의를 수강하면서 문제를 직접 해결하신 점에서도 많은 진전을 보이신 것 같습니다.

질문해 주신 문제에 대해 설명드리겠습니다. yfinance 데이터를 Snowflake에 적재하는 과정에서 발생한 문제는 파일 경로 처리와 관련된 것으로 보입니다. 로그나 에러 메시지 없이 문제를 정확히 판단하기는 어렵지만, file_path를 직접 전달하여 문제를 해결하신 방법은 매우 적절해 보입니다.

기존 코드에서 file_path 변수를 직접 재사용하지 않고 함수 내에서 경로를 재생성하려고 하여 발생한 문제를 수정하신 것 같습니다. 데이터 적재 시, 올바른 파일 경로로 데이터를 정확히 식별하는 것이 중요합니다. 귀하께서 수정하신 방식은 이러한 문제를 방지할 수 있는 좋은 접근입니다.

관련 강의의 데모 영상과 비교하여 동일한 결과가 나왔다면 문제 없이 잘 해결하신 것으로 판단됩니다. 만약 이후에도 문제가 발생한다면, 오류 로그를 통해 문제의 원인을 더 깊이 파악하시는 것도 좋겠습니다.

비슷한 오류 발생 시, 아래 링크를 참고로 하시면 좋을 것 같습니다:
- [왜 데이터를 코드로 전처리하는가?] 관련 질문 및 답변

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

hodoldol님의 프로필 이미지
hodoldol

작성한 질문수

질문하기