I.はじめに
MRタスクが関連するハイブテーブルデータを処理する場合、形式はorcとrcFileです。2つの処理方法を以下に説明します。
2.レイジーバージョンはORC、RcFileファイルを読み取ります
最初はmrに慣れていなかったので、textFormatの入力モードは1つしかありませんでした。そのため、orcとrcFileの形式のハイブデータに遭遇し、mrで読み取る必要がある場合、最初にhdfsテキストデータをから再出力しました。 INSERT OVERWRITE DIRECTORYを使用してハイブテーブルを作成します。次に、mrを使用してテキストファイルを読み取ります。この方法は、怠惰で元のハイブデータが大きくない場合に適しています。元のハイブテーブルデータが大きい場合、変換操作はより多くのリソースを消費します。 。
function insert() {
hive -e"
INSERT OVERWRITE DIRECTORY '$path'
select * from Table where dt='$dt';"
}
この時点で、TextFormatを使用してファイルを読み取り、マッパーを生成するプロセスを実行します。
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の依存関係
主にhadoopmap-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()は、対応する列のコンテンツを選択し、コンテンツをWritableComparableタイプとして直接取得します。これには、toString変換が必要です。
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.まとめ
怠惰なバージョンの形成は、最初は適切な学習が不足していたために発生したため、この戦略を採用して、データをさらに一歩進めて変換し、配置します。生徒はこれを警告として受け止め、より多くのより良い方法を学ぶ必要があります。