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