Flink 는 어떤 데이터 형식 을 지원 합 니까?

9240 단어 Flink데이터 형식
1.지원 하 는 데이터 형식
Flink 는 DataSet 이나 DataStream 에서 사용 할 수 있 는 요소 유형 을 제한 했다.이렇게 하 는 이 유 는 시스템 이 유형 을 분석 하여 효과 적 인 실행 전략 을 확정 하기 때문이다.
1.자바 Tuple 과 Scala Case 류;
2.Java POJO;
3.기본 유형;
4.공통 클래스;
5.값;
6.Hadoop Writables;
7.특수 유형
2.Flink 의 Tuple 유형
튜 플 타 입  Tuple 예flink 매우 특수 한 유형(원조 유형)은 추상 적 인 유형 으로 모두 26 개Tuple의 하위 계승Tuple이다. 그들 은  Tuple0Tuple 25 까지

package org.apache.flink.api.java.tuple;
​
import java.io.Serializable;
import org.apache.flink.annotation.Public;
import org.apache.flink.types.NullFieldException;
​
@Public
public abstract class Tuple implements Serializable {
    private static final long serialVersionUID = 1L;
    public static final int MAX_ARITY = 25;
    private static final Class<?>[] CLASSES = new Class[]{Tuple0.class, Tuple1.class, Tuple2.class, Tuple3.class, Tuple4.class, Tuple5.class, Tuple6.class, Tuple7.class, Tuple8.class, Tuple9.class, Tuple10.class, Tuple11.class, Tuple12.class, Tuple13.class, Tuple14.class, Tuple15.class, Tuple16.class, Tuple17.class, Tuple18.class, Tuple19.class, Tuple20.class, Tuple21.class, Tuple22.class, Tuple23.class, Tuple24.class, Tuple25.class};
​
    public Tuple() {
    }
​
    public abstract <T> T getField(int var1);
​
    public <T> T getFieldNotNull(int pos) {
        T field = this.getField(pos);
        if (field != null) {
            return field;
        } else {
            throw new NullFieldException(pos);
        }
    }
​
    public abstract <T> void setField(T var1, int var2);
​
    public abstract int getArity();
​
    public abstract <T extends Tuple> T copy();
​
    public static Class<? extends Tuple> getTupleClass(int arity) {
        if (arity >= 0 && arity <= 25) {
            return CLASSES[arity];
        } else {
            throw new IllegalArgumentException("The tuple arity must be in [0, 25].");
        }
    }
​
    public static Tuple newInstance(int arity) {
        switch(arity) {
        case 0:
            return Tuple0.INSTANCE;
        case 1:
            return new Tuple1();
        case 2:
            return new Tuple2();
        case 3:
            return new Tuple3();
        case 4:
            return new Tuple4();
        case 5:
            return new Tuple5();
        case 6:
            return new Tuple6();
        case 7:
            return new Tuple7();
        case 8:
            return new Tuple8();
        case 9:
            return new Tuple9();
        case 10:
            return new Tuple10();
        case 11:
            return new Tuple11();
        case 12:
            return new Tuple12();
        case 13:
            return new Tuple13();
        case 14:
            return new Tuple14();
        case 15:
            return new Tuple15();
        case 16:
            return new Tuple16();
        case 17:
            return new Tuple17();
        case 18:
            return new Tuple18();
        case 19:
            return new Tuple19();
        case 20:
            return new Tuple20();
        case 21:
            return new Tuple21();
        case 22:
            return new Tuple22();
        case 23:
            return new Tuple23();
        case 24:
            return new Tuple24();
        case 25:
            return new Tuple25();
        default:
            throw new IllegalArgumentException("The tuple arity must be in [0, 25].");
        }
    }
}
원본 보기Tuple0Tuple 25 까지
플 랭크 를 보면 0-25 필드 의 템 플 릿 류 를 만들어 주 셨 어 요.

ackage org.apache.flink.api.java.tuple;
​
import java.io.ObjectStreamException;
import org.apache.flink.annotation.Public;
​
@Public
public class Tuple0 extends Tuple {
    private static final long serialVersionUID = 1L;
    public static final Tuple0 INSTANCE = new Tuple0();
​
    public Tuple0() {
    }
​
    public int getArity() {
        return 0;
    }
​
    public <T> T getField(int pos) {
        throw new IndexOutOfBoundsException(String.valueOf(pos));
    }
​
    public <T> void setField(T value, int pos) {
        throw new IndexOutOfBoundsException(String.valueOf(pos));
    }
​
    public Tuple0 copy() {
        return new Tuple0();
    }
​
    public String toString() {
        return "()";
    }
​
    public boolean equals(Object o) {
        return this == o || o instanceof Tuple0;
    }
​
    public int hashCode() {
        return 0;
    }
​
    private Object readResolve() throws ObjectStreamException {
        return INSTANCE;
    }
}
3.Tuple 의 사용
방식 1:원본 그룹 초기 화
정적 방법 new Instance 를 사용 하여 원 그룹 구 조 를 지정 할 수 있 습 니 다.
ex:1 개의 원 조 는 하나의 공간 만 있 고 실제 사용 하 는 Tuple 1 필드 는 f0 만 있 습 니 다.
ex:12 개의 원 조 는 두 개의 공간 만 있 고 실제 사용 하 는 Tuple 2 필드 는 f0,f1 밖 에 없다.
지정  Tuple 모듈 공간 크기(필드 개수 로 이해 가능)

Tuple tuple = Tuple.newInstance(1);
방식 1:구조 원 그룹 
Tuple.newInstance(xx)를 사용 하여 원 그룹 공간 크기 를 지정 하면 액세스 가 가능 하지만 색인 위 치 를 잘못 저장 하 는 경우 가 있 습 니 다.실수 로 색인 크로스 오 버 를 만 들 수 있 고 사용 이 불편 할 수 있 습 니 다.Tuplex.of(데이터)방법 으로 Tuple 원 그룹 을 구성 합 니 다.

Tuple3<String, String, String> tuple3 = Tuple3.of("test0", "test1", "test2");
System.out.println(tuple3.f0); // test0
System.out.println(tuple3.f1); // test1
System.out.println(tuple3.f2); // test2
4.Flink 의 POJO 유형
자바 와 스칼라 의 클래스 는 다음 조건 을 만족 시 킬 때 Flink 에 의 해 특수 한 POJO 데이터 형식 으로 처 리 됩 니 다.
1.공공 류 입 니 다.
2.무 참 구 조 는 공공 이다.
3.모든 속성 은 얻 을 수 있 습 니 다(공공 으로 성명 하거나 get,set 방법 을 제공 합 니 다).
4.필드 의 형식 은 Flink 가 지원 해 야 합 니 다.Flink 는 Avro 로 임의의 대상 을 정렬 합 니 다.
플 링크 는 POJO 유형의 구 조 를 분석 해 POJO 필드 를 알 게 된다.POJO 타 입 은 일반 타 입 보다 좋 습 니 다.또한 플 링크 의 POJO 방문 은 일반 유형 보다 효율 적 이 었 다.

public class WordWithCount {
    public String word;
    public int count;
    public WordWithCount() {}
    public WordWithCount(String word, int count) { this.word = word; this.count = count; }
}
    DataStream<WordWithCount> wordCounts = env.fromElements(
    new WordWithCount("hello", 1),
    new WordWithCount("world", 2));
    wordCounts.keyBy("word");
5.Flink 의 기본 유형
Flink 는 Integer,String,Double 등 자바 와 스칼라 의 모든 기본 데이터 형식 을 지원 합 니 다.
6.Flink 의 일반적인 유형
Flink 는 대부분의 자바,스칼라 류(API 와 사용자 정의)를 지원 합 니 다.정렬 할 수 없 는 필드 를 포함 하 는 클래스 는 제한 을 추가 한 후에 도 지원 할 수 있 습 니 다.자바 빈 규범 에 따 른 클래스 는 일반적으로 사용 할 수 있 습 니 다.
POJO 로 볼 수 없 는 모든 플 링크 는 일반 클래스 로 처 리 됩 니 다.이 데이터 형식 들 은 블랙박스 로 간주 되 며,그 내용 은 보이 지 않 는 다.유 니 버 설 클래스 는 Kryo 를 사용 하여 서열/반 서열 화 를 진행 합 니 다.
7.Flink 의 값 유형 Values
org.apache.flinktypes.Value 인 터 페 이 스 를 실현 하 는 read 와 write 방법 을 통 해 사용자 정의 코드 를 제공 하여 직렬 화/반 직렬 화 를 진행 합 니 다.일반적인 직렬 화 프레임 워 크 를 사용 하 는 것 이 아 닙 니 다.
Flink 가 미리 정의 한 값 유형 은 네 이 티 브 데이터 형식 과 일일이 대응 합 니 다(예 를 들 어 ByteValue,Short Value,IntValue,LongValue,FloatValue,DoubleValue,StringValue,CharValue,BooleanValue).이러한 값 유형 은 네 이 티 브 데이터 형식의 가 변 변형 체 로 서 그들의 값 은 바 꿀 수 있 고 프로그램 이 대상 을 다시 사용 하여 GC 의 압력 을 완화 할 수 있 도록 합 니 다.
8.Flink 의 Hadoop Writable 클래스
org.apache.hadop.Writable 인터페이스의 유형 을 실현 합 니 다.이 유형의 직렬 화 논 리 는 write()와 readFields()방법 에서 이 루어 집 니 다.
9.Flink 의 특수 유형
Flink 의 특별한 유형 은 다음 과 같은 두 가지 가 있 습 니 다.
1.Scala 의 Either,Option,Try.
2.자바 에이 피 는 나 름 대로 의 에 이 더 실현 이 있다.
자바 Api 는 스칼라 와 유사 하 다Either.이것 은 두 가지 가능 한 유형의 값,Left 또는 Right 를 나타 낸다.Either오류 처리 나 두 가지 서로 다른 유형의 기록 을 출력 해 야 하 는 연산 자 에 유용 하 다.
유형 지우 기와 유형 추리
자바 컴 파 일 러 는 컴 파 일 러 를 한 후에 많은 일반적인 유형의 정 보 를 버린다.이것 은 자바 에서 형식 지우 기 라 고 합 니 다.이것 은 실행 할 때 대상 의 인 스 턴 스 가 일반적인 유형 을 알 지 못 한 다 는 것 을 의미한다.
예 를 들 어 JVM 에서 DataStream과 DataStream의 인 스 턴 스 는 같 아 보인다.

List<String> l1 = new ArrayList<String>();
List<Integer> l2 = new ArrayList<Integer>();
System.out.println(l1.getClass() == l2.getClass());
범 형:비교적 정확 한 표현 은 바로 매개 변수 화 유형 을 위 한 것 이거 나 유형 을 매개 변수 로 한 가지 유형 이나 방법 에 전달 할 수 있다 는 것 이다.Flink 의 자바 API 는 버 려 진 형식 정 보 를 재 구축 하고 데이터 세트 와 작업 에 명확 하 게 저장 하려 고 합 니 다.DataStream.getType()방법 을 통 해 형식 을 가 져 올 수 있 습 니 다.이 방법 은 TypeInformation 의 인 스 턴 스 를 되 돌려 줍 니 다.이 인 스 턴 스 는 Flink 내부 에서 형식 을 표시 하 는 방식 입 니 다.
이 플 링크 는 어떤 데이터 형식 을 지원 합 니까?이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Flink 와 관련 된 데이터 형식 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기