점진적 계산은 결과물 데이터셋을 생성하기 위해 변환을 수행하는 효율적인 방법입니다. 변환의 빌드 이력을 활용함으로써, 점진적 계산은 변환이 실행될 때마다 전체 결과물 데이터셋을 다시 계산할 필요를 피할 수 있습니다.
점진적 파이프라인을 생성하고 관리하는 방법에 대한 종합적인 안내를 위해, 파이프라인 빌드 섹션을 참조하십시오.
이 섹션에서는 점진적 변환을 사용하지 않는 코드 예시를 먼저 고려하여 점진적 변환의 장점을 살펴봅니다:
Copied!1 2 3 4 5 6 7 8 9 10 11 12
from transforms.api import transform, Input, Output @transform( students=Input('/examples/students_hair_eye_color'), processed=Output('/examples/hair_eye_color_processed') ) def filter_hair_color(students, processed): # type: (TransformInput, TransformOutput) -> None students_df = students.dataframe() # 이것은 비효율적인 방법입니다. 왜냐하면 필터 함수가 새로운 데이터에 대해서만 수행되는 것이 아니라 전체 입력에 대해 수행되기 때문입니다. processed.write_dataframe(students_df.filter(students_df.hair == 'Brown'))
새로운 데이터가 /examples/students_hair_eye_color
입력 데이터셋에 추가되면, filter()
는 입력된 전체 대상으로 수행되며, 단순히 입력에 추가된 새로운 데이터만을 대상으로 하는 것이 아닙니다. 이는 계산 자원과 시간을 낭비하는 것입니다.
변환(Transform)이 빌드 이력을 인식하게 될 경우, 결과물을 계산하는 방법에 대해 더욱 똑똑해질 수 있습니다. 보다 구체적으로는, 입력에 대한 변경사항을 사용하여 결과물 데이터셋을 수정할 수 있습니다. 이렇게 이미 구체화된 데이터를 다시 테이블화할 때 사용하는 과정을 점진적 계산이라고 합니다. 점진적 계산 없이는 결과물 데이터셋이 항상 최신 변환 결과물로 대체됩니다.
위에서 보여준 예시 변환으로 돌아가 보겠습니다. 변환은 students
데이터셋에 대해 filter()
를 수행하여 갈색 머리의 학생들만을 출력으로 작성합니다. 점진적 계산을 사용하면, students
에 대한 두 명의 새로운 학생 데이터가 추가되면, 변환은 빌드 이력에 대한 정보를 사용하여 새로운 갈색 머리 학생만을 결과물에 추가할 수 있습니다:
+---+-----+-----+------+ +---+-----+-----+------+
| id| hair| eye| sex| | id| hair| eye| sex|
+---+-----+-----+------+ 빌드 1 +---+-----+-----+------+
| 17|Black|Green|Female| ---------> | 18|Brown|Green|Female|
| 18|Brown|Green|Female| +---+-----+-----+------+
| 19| Red|Black|Female|
+---+-----+-----+------+
... ...
+---+-----+-----+------+ 빌드 2 +---+-----+-----+------+
| 20|Brown|Amber|Female| ---------> | 20|Brown|Amber|Female|
| 21|Black|Blue |Male | +---+-----+-----+------+
+---+-----+-----+------+
위의 예제 변환은 다음 구문을 사용하여 점진적 로직으로 다시 작성할 수 있습니다:
Copied!1 2 3 4 5 6 7 8 9 10 11
from transforms.api import transform, incremental, Input, Output @incremental() @transform( students=Input('/examples/students_hair_eye_color'), # students라는 이름으로 '/examples/students_hair_eye_color'을 입력으로 받습니다. processed=Output('/examples/hair_eye_color_processed') # 처리된 결과를 '/examples/hair_eye_color_processed'로 출력합니다. ) def filter_hair_color(students, processed): # type: (IncrementalTransformInput, IncrementalTransformOutput) -> None # 이 함수의 입력은 IncrementalTransformInput 타입의 students와 IncrementalTransformOutput 타입의 processed이며, 반환 값은 없습니다(None). students_df = students.dataframe('added') # students의 데이터를 데이터프레임으로 변환하고, 'added'라는 이름으로 저장합니다. processed.write_dataframe(students_df.filter(students_df.hair == 'Brown')) # 데이터프레임에서 머리 색깔(hair)이 'Brown'인 학생들만 필터링하고, 그 결과를 processed에 씁니다.
점진적 변환과 @incremental
데코레이터에 대한 자세한 정보는 점진적 변환 출처를 참조하십시오.
데이터셋 중 하나가 완전히 읽히는 참조 표이고 다른 하나가 점진적으로 읽히는 점진적 데이터셋인 경우 조인을 계산하는 것이 안전합니다. 그러나 조인에 참여하는 두 데이터셋을 모두 점진적으로 읽는 것은 특별한 처리가 필요하며, 예제 큰 데이터셋 결합을 위한 점진적 변환 활용을 참조하십시오.