데이터 인코딩

파이프라인 데이터를 만들거나 출력할 때 PCollection의 요소를 바이트 문자열로 인코딩하고 디코딩하는 방법을 지정해야 합니다. 바이트 문자열은 소스에서 읽거나 싱크에 작성하는 데 중간 저장소로 사용됩니다. Dataflow SDK는 coder라는 객체를 사용하여 지정된 PCollection 요소의 인코딩 및 디코딩 방법을 설명합니다.

Coder 사용

일반적으로 외부 소스에서 파이프라인으로 데이터를 읽거나 로컬 데이터에서 파이프라인 데이터를 생성할 때, 그리고 파이프라인 데이터를 외부 싱크에 출력할 때에도 Coder를 지정해야 합니다. 자세한 내용은 파이프라인 I/O를 참조하세요.

자바

자바용 Dataflow SDK에서 Coder 유형은 데이터 인코딩 및 디코딩에 필요한 메소드를 제공합니다. 자바용 Dataflow SDK는 Integer, Long, Double, StringUtf8, BigQuery TableRow 등 다양한 표준 자바 유형으로 작동하는 여러 Coder 하위 클래스를 제공합니다. com.google.cloud.dataflow.sdk.coders 패키지에서 사용 가능한 모든 Coder 하위 클래스를 확인할 수 있습니다.

데이터를 파이프라인으로 읽을 때 Coder는 입력 데이터를 Integer 또는 String 등의 언어별 유형으로 해석하는 방법을 나타냅니다. 마찬가지로 Coder는 파이프라인의 언어별 유형을 출력 데이터 싱크에 대한 바이트 문자열로 작성하거나 중간 데이터를 파이프라인에 구현하는 방법을 나타냅니다.

Dataflow SDK는 파이프라인 내의 모든 PCollection에 Coder를 설정합니다. 여기에는 변환의 출력으로 생성된 PCollection도 포함됩니다. 대부분의 경우 Dataflow SDK는 자동으로 출력 PCollection에 올바른 Coder를 추론할 수 있습니다. 자세한 내용은 Coder 추론을 참조하세요.

Coder는 반드시 유형과 1 대 1 관계를 가질 필요는 없습니다. 예를 들어 Integer 유형은 여러 개의 유효한 Coder를 가질 수 있고, 입력 데이터와 출력 데이터는 서로 다른 Integer Coder를 사용할 수 있습니다. 하나의 변환은 BigEndianIntegerCoder를 사용하는 Integer 유형의 입력 데이터와 VarIntCoder를 사용하는 Integer 유형의 출력 데이터를 가질 수 있습니다.

자바

PCollection을 입력하거나 출력할 때 Coder를 명시적으로 설정할 수 있습니다. 파이프라인의 Read 또는 Write 변환을 적용할 때 .withCoder 메소드를 호출하여 Coder를 설정합니다.

일반적으로 PCollection의 Coder를 자동으로 추론할 수 없거나 파이프라인의 기본값과 다른 Coder를 사용하려고 할 때 Coder를 설정합니다. 다음 예시 코드는 텍스트 파일에서 숫자 세트를 읽고 결과 PCollectionTextualIntegerCoder 유형 Coder를 설정합니다.

  PCollection<Integer> numbers =
     p.begin()
      .apply(TextIO.Read.named("ReadNumbers")
                        .from("gs://my_bucket/path/to/numbers-*.txt")
                        .withCoder(TextualIntegerCoder.of()));

PCollection.setCoder 메소드를 사용하여 기존의 PCollection에 Coder를 설정할 수 있습니다. .apply를 호출하거나 하여 최종화된 PCollection에는 setCoder를 호출할 수 없습니다.

getCoder 메소드를 사용하여 기존의 PCollection에 Coder를 설정할 수 있습니다. 지정된 PCollection에서 Coder가 설정되지 않고 추론할 수 없을 경우 이 메소드는 실패하고 IllegalStateException을 반환합니다.

Coder 추론 및 기본 Coder

Dataflow SDK에는 파이프라인의 모든 PCollection에 대한 Coder가 필요합니다. 하지만 대부분의 경우 파이프라인 중간에서 변환으로 생성된 중간 PCollection 등의 Coder를 명시적으로 지정할 필요가 없습니다. 이러한 경우 Dataflow SDK는 PCollection을 생성하기 위해 사용된 변환의 입력 및 출력에서 적절한 Coder를 추론할 수 있습니다.

자바

Pipeline 객체에는 CoderRegistry가 있습니다. CoderRegistry는 파이프라인이 각 유형의 PCollection에 사용하는 기본 Coder의 자바 유형 매핑을 나타냅니다.

기본적으로 자바용 Dataflow SDK는 변환의 함수 객체(예: DoFn)에서 유형 매개변수를 사용하여 PCollection 출력 요소의 Coder를 자동으로 추론합니다. 예를 들어, ParDo의 경우 DoFn<Integer, String> 함수 객체는 Integer 유형의 입력 요소를 수락하여 String 유형의 출력 요소를 생성합니다. 이러한 경우, 자바용 Dataflow SDK는 자동으로 PCollection<String> 출력의 기본 Coder를 추론합니다(기본 파이프라인 CoderRegistry의 경우에는 StringUtf8Coder).

기본 Coder 및 CoderRegistry

Pipeline 객체에는 파이프라인이 사용해야 하는 기본 Coder에 언어 유형을 매핑하는 CoderRegistry 객체가 포함되어 있습니다. 직접 CoderRegistry를 사용하여 특정 유형의 기본 Coder를 확인하거나 해당 유형에 새로운 기본 Coder를 등록할 수 있습니다.

자바

CoderRegistry에는 자바용 Dataflow SDK를 통해 생성한 모든 Pipeline의 표준 자바 유형의 기본 Coder 매핑이 포함되어 있습니다. 다음 테이블은 표준 매핑을 보여줍니다.

자바 유형 기본 Coder
Double DoubleCoder
Instant InstantCoder
Integer VarIntCoder
Iterable IterableCoder
KV KvCoder
List ListCoder
Map MapCoder
Long VarLongCoder
String StringUtf8Coder
TableRow TableRowJsonCoder
Void VoidCoder
byte[] ByteArrayCoder
TimestampedValue TimestampedValueCoder

CoderRegistry.registerStandardCoders 메소드를 사용하여 특정 CoderRegistry의 기본 매핑을 설정할 수 있습니다.

기본 Coder 확인

자바

CoderRegistry.getDefaultCoder 메소드를 사용하여 자바 유형의 기본 Coder를 파악할 수 있습니다. 특정 PipelineCoderRegistry에 액세스하려면 Pipeline.getCoderRegistry 메소드를 사용하면 됩니다. 이렇게 하면 파이프라인 단위로 자바 유형의 기본 Coder를 파악하거나 설정할 수 있습니다(이 파이프라인에서는 Integer 값이 BigEndianIntegerCoder로 인코딩되는지 확인).

특정 유형의 기본 Coder 설정

자바

특정 파이프라인의 자바 유형에 기본 Coder를 설정하려면 파이프라인의 CoderRegistry를 가져와 수정해야 합니다. Pipeline.getCoderRegistry 메소드를 사용하여 CoderRegistry 객체를 가져온 다음 CoderRegistry.registerCoder 메소드를 사용하여 대상 자바 유형에 새로운 Coder를 등록합니다.

다음 예시 코드는 기본 Coder를 설정하는 방법을 보여줍니다. 이 예에서는 파이프라인의 Integer 값에 BigEndianIntegerCoder를 설정합니다.

  PipelineOptions options = PipelineOptionsFactory.create();
  Pipeline p = Pipeline.create(options);

  CoderRegistry cr = p.getCoderRegistry();
  cr.registerCoder(Integer.class, BigEndianIntegerCoder.class);

기본 Coder로 커스텀 데이터 유형에 주석 달기

자바

파이프라인이 커스텀 데이터 유형을 정의할 경우 @DefaultCoder 주석을 사용하여 해당 유형에 사용할 Coder를 지정할 수 있습니다. 예를 들어 커스텀 데이터 유형에 SerializableCoder를 사용하고 싶다고 가정하겠습니다. 다음과 같이 @DefaultCoder 주석을 사용할 수 있습니다.

  @DefaultCoder(AvroCoder.class)
  public class MyCustomDataType {
    ...
  }

데이터 유형에 맞는 커스텀 coder를 만든 경우, @DefaultCoder 주석을 사용하려면 coder 클래스가 정적 Coder.of(Class<T>) 팩토리 메소드를 구현해야 합니다.

  public class MyCustomCoder implements Coder {
    public static Coder<T> of(Class<T> clazz) {...}
    ...
  }

  @DefaultCoder(MyCustomCoder.class)
  public class MyCustomDataType {
    ...
  }
이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.