Python 변환은 출력 데이터셋이 변경되지 않은 경우(데이터셋에 새 데이터가 쓰여지지 않은 경우) 작업이 성공적으로 완료될 수 있도록 트랜잭션을 중단하는 지원을 제공합니다. 이는 transform
데코레이터를 사용하고 TransformOutput
오브젝트에서 .abort()
를 호출함으로써 달성됩니다.
트랜잭션 중단은 특정 조건 하에서 출력 데이터셋과 하류 데이터셋의 업데이트를 방지해야 할 때 사용할 수 있습니다. 출력 데이터셋이 업데이트되는 즉시, 하류 데이터셋은 오래된(stale) 것으로 간주되며, 다음에 빌드될 때 업데이트됩니다(수동으로 빌드하거나 일정에 따라 빌드). 이는 빌드 실패에 대한 대안을 제공합니다. 이렇게 하면 실제로 실패하는 상황을 쉽게 식별할 수 있습니다.
중단된 트랜잭션은 데이터셋 트랜잭션 기록에서 회색으로 표시되는 성공적인 작업으로 나타납니다. 이는 성공적인 빌드가 트랜잭션을 커밋했는지 여부를 한눈에 구별할 수 있게 해줍니다.
트랜잭션을 중단하려는 경우의 예시:
항상 업데이트되지만 항상 변경된 출력을 결과로 내놓지 않는 데이터셋 뒤에 abort()
를 사용하는 검증 데이터셋을 추가하면 불필요한 하류 업데이트를 피함으로써 컴퓨팅 자원을 절약합니다.
아래는 간단한 가상의 예시로, 입력 데이터셋에 오늘의 데이터가 도착했는지 확인하여 데이터셋이 업데이트되는지 여부를 결정하고 싶을 수 있는 경우입니다.
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
# 필요한 라이브러리와 모듈을 불러옵니다. from transforms.api import transform, Input, Output from datetime import date # 트랜스폼 함수를 정의합니다. 이 함수는 주어진 데이터를 처리하고 결과를 반환합니다. @transform( holiday_trips=Input('/examples/trips'), # 휴일 여행 데이터를 입력으로 받습니다. processed=Output('/examples/trips_processed') # 처리된 데이터를 출력합니다. ) def update_daily_trips(holiday_trips, processed): holiday_trips_df = holiday_trips.dataframe() # 휴일 여행 데이터를 데이터프레임으로 변환합니다. # 오늘 날짜의 여행 데이터만 필터링합니다. todays_trips_df = holiday_trips_df.filter(holiday_trips_df.trip_date == date.today()) # 오늘 날짜의 여행 데이터가 없으면 처리를 중단합니다. if (todays_trips_df.count() == 0): processed.abort() else: # 오늘 날짜의 여행 데이터가 있으면 결과를 저장합니다. processed.write_dataframe(todays_trips_df)
if (len(todays_trips_df.head(1)) == 0)
을 사용하면 if (todays_trips_df.count() == 0)
보다 일반적으로 빠른 결과를 얻을 수 있습니다. 왜냐하면 하나 이상의 행이 존재하는지만 확인하기 때문에 모든 행을 불필요하게 세지 않기 때문입니다.
작업이 "무시"로 표시되면 Foundry는 작업 사양이 오래되지 않았다고 판단하여 계산을 실행하지 않습니다. 트랜잭션이 중단되면 작업이 실행되고 성공적으로 완료되지만 결과물 데이터셋은 변경되지 않고 트랜잭션은 커밋되지 않습니다.
점진적 변환은 커밋된 트랜잭션만 사용하여 입력값과 결과물의 데이터셋 뷰를 읽습니다. 이는 점진적 계산을 수행할 때 중단된 트랜잭션을 무시한다는 것을 의미합니다.
트랜잭션이 점진적 변환의 모든 결과물에서 명시적으로 중단되면 다음 빌드는 중단된 트랜잭션이 발생하지 않은 것처럼 입력값을 읽고 (따라서 재처리)하고 점진적으로 실행할 수 있습니다. 트랜잭션이 결과물의 일부에서만 중단되면 빌드는 점진적으로 실행할 수 없습니다. 중단된 트랜잭션이 있는 결과물의 경우, 결과물 작업 사양은 중단된 트랜잭션이 무시되기 때문에 이전 입력 트랜잭션 범위를 사용합니다. 커밋된 트랜잭션이 있는 결과물의 경우, 결과물 작업 사양은 현재 입력 트랜잭션 범위를 사용합니다. 이 입력 트랜잭션 범위의 불일치로 인해 변환은 더 이상 점진적으로 실행할 수 없습니다.
다중 결과물 점진적 변환에서 트랜잭션이 결과물의 일부에서 명시적으로 중단되면 다음 빌드는 스냅샷으로 실행되거나 require_incremental=True
인 경우 InconsistentProvenanceRecords
오류로 실패합니다. 이는 출력물의 현재 뷰가 이제 다른 입력 트랜잭션에 의해 생성되었기 때문입니다.