MapReduce - ORC, RcFile 파일 읽기

I. 서론

MR 작업이 관련 하이브 테이블 데이터를 처리할 때 형식은 orc 및 rcFile이며 두 가지 처리 방법은 다음과 같습니다.

2. 지연 버전은 ORC, RcFile 파일을 읽습니다.

처음에는 mr에 익숙하지 않았기 때문에 textFormat의 입력 모드가 하나만 있었기 때문에 orc 및 rcFile 형식의 하이브 데이터를 만나 mr에서 읽어야 할 때 먼저 hdfs 텍스트 데이터를 다시 출력했습니다. INSERT OVERWRITE DIRECTORY를 통해 하이브 테이블.그런 다음 mr을 사용하여 텍스트 파일을 읽습니다.이 방법은 게으른 데 적합하고 원래 하이브 데이터가 크지 않습니다.원래 하이브 테이블 데이터가 크면 변환 작업이 더 리소스 집약적입니다. .

function insert() {
hive -e"
INSERT OVERWRITE DIRECTORY '$path'
select * from Table where dt='$dt';"
}

이 시점에서 TextFormat을 사용하여 파일을 읽고 Mapper를 생성하는 프로세스를 수행합니다.

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

public class TextMapper extends Mapper<LongWritable, Text, Text, Text> {

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

        try {
            String[] s = value.toString().split("\t");
            String _key = s[0];
            String _value = s[1];
            context.write(new Text(_key), new Text(_value));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

3. 공식 버전은 ORC, RcFile 파일을 읽습니다.

1.pom 종속성

주로 hadoop map-reduce 및 org.orc 관련 종속성

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.7.3</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-mapreduce-client-core</artifactId>
            <version>2.7.3</version>
        </dependency>

        <dependency>
            <groupId>org.apache.orc</groupId>
            <artifactId>orc-core</artifactId>
            <version>1.2.3</version>
        </dependency>

        <dependency>
            <groupId>org.apache.orc</groupId>
            <artifactId>orc-mapreduce</artifactId>
            <version>1.1.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hive.hcatalog</groupId>
            <artifactId>hive-hcatalog-core</artifactId>
            <version>0.13.1</version>
        </dependency>

2. orc 파일 읽기

Orc 파일을 읽으려면 해당 OrcStruct 및 OriInputFormat을 선택해야 합니다.

A. orc 파일을 읽는 매퍼

getFiledValue()는 해당 열의 내용을 선택하고 toString 변환이 필요한 WritableComparable 유형으로 내용을 직접 얻습니다.

public static class OrcMapper extends Mapper<LongWritable, OrcStruct, Text, Text> {

@Override
protected void map(LongWritable key, OrcStruct value, Context context) throws IOException, InterruptedException {

    String key = value.getFieldValue(0).toString();
    context.write(new Text(key), new Text(value.getFieldValue(1)));
    context.write(new Text(key), new Text(value.getFieldValue(2)));

    }
}

B. 매퍼 추가

import org.apache.hadoop.mapreduce.lib.input.MultipleInputs;

MultipleInputs.addInputPath(job, new Path(input), OrcInputFormat.class, OrcMapper.class);

3. RcFile 파일 읽기

A. RcFile 파일을 읽고 쓰기 위한 매퍼

여기에서 얻은 값은 BytesRefWritable 형식이며, 문자열 유형 문자를 얻으려면 역직렬화하고 읽어야 합니다.

import org.apache.hadoop.hive.serde2.columnar.BytesRefArrayWritable;
import org.apache.hadoop.hive.serde2.columnar.BytesRefWritable;

public static class RcFileMapper extends Mapper<LongWritable, BytesRefArrayWritable, Text, Text> {

    @Override
    protected void map(LongWritable key, BytesRefArrayWritable value, Context context)
            throws IOException, InterruptedException {

        BytesRefWritable _id = value.get(0);
        BytesRefWritable _value = value.get(1);

        String id = LazyBinaryRCFileUtils.readString(_id).trim();
        String value = LazyBinaryRCFileUtils.readString(_value).trim();
        
        context.write(new Text(id), new Text(value));
    }
}

B. 매퍼 추가

MultipleInputs.addInputPath(job, new Path(input), RcfileCombineFileInputFormat.class, RcFileMapper.class);

4. 요약

게으른 버전의 형성은 초기에 적절한 학습이 없었기 때문에 이 전략을 채택하여 데이터를 한 단계 더 변환하고 배치했습니다. 학생들은 이것을 경고로 받아들이고 더 많은 방법을 배워야 합니다.

рекомендация

отblog.csdn.net/BIT_666/article/details/124267104