[HADOOP] .txt / .csv 파일을 ORC 형식으로 변환하는 방법
HADOOP.txt / .csv 파일을 ORC 형식으로 변환하는 방법
일부 요구 사항에 대해 (구분 된) 텍스트 파일을 ORC (최적화 된 행 Columnar) 형식으로 변환하고 싶습니다. 정기적 인 간격으로 실행해야하므로 이렇게 할 Java 프로그램을 작성하고 싶습니다. 하이브 임시 테이블 해결 방법을 사용하고 싶지 않습니다. 아무도 도와 줄 수 있습니까? 아래는 내가 시도한 것이다.
/*ORCMapper.java*/
import java.io.IOException;
import java.util.*;
import org.apache.hadoop.mapred.*;
import org.apache.hadoop.hive.ql.io.orc.*;
import org.apache.hadoop.io.*;
public class ORCMapper extends MapReduceBase implements
Mapper<LongWritable, Text, NullWritable, Writable>{
OrcSerde serde;
@Override
public void configure(JobConf job) {
serde = new OrcSerde();
}
@Override
public void map(LongWritable key, Text value,
OutputCollector<NullWritable, Writable> output, Reporter reporter)
throws IOException {
output.collect(NullWritable.get(),serde.serialize(value, null));
}
}
/*ORCReducer.java*/
import java.io.IOException;
import java.util.Iterator;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;
public class ORCReducer extends MapReduceBase implements Reducer<NullWritable, Writable, NullWritable, Writable>{
@Override
public void reduce(NullWritable key, Iterator<Writable> values,
OutputCollector<NullWritable, Writable> output, Reporter reporter)
throws IOException {
Writable value = values.next();
output.collect(key, value);
}
}
/*ORCDriver.java*/
import java.io.*;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.hive.ql.io.orc.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;
public class ORCDriver {
public static void main(String[] args) throws IOException,
InterruptedException, ClassNotFoundException {
JobClient client = new JobClient();
JobConf conf = new JobConf("ORC_Generator");
conf.setInputFormat(TextInputFormat.class);
conf.setOutputKeyClass(NullWritable.class);
conf.setOutputValueClass(Writable.class);
conf.setOutputFormat(OrcOutputFormat.class);
FileInputFormat.addInputPath(conf, new Path("hdfs://localhost:9000/path/to/ipdir/textfile"));
OrcOutputFormat.setOutputPath(conf, new Path("hdfs://localhost:9000/path/to/opdir/orcfile"));
conf.setMapperClass(ORCMapper.class);
System.out.println(OrcOutputFormat.getWorkOutputPath(conf));
conf.setNumReduceTasks(0);
client.setConf(conf);
try {
JobClient.runJob(conf);
} catch (Exception e) {
e.printStackTrace();
}
}
}
이것을 실행하면 오류가 발생하고 part-00000이라는 파일이 내 로컬에서 생성됩니다.
java.io.IOException: File already exists:part-00000
at org.apache.hadoop.fs.RawLocalFileSystem.create(RawLocalFileSystem.java:249)
at org.apache.hadoop.fs.RawLocalFileSystem.create(RawLocalFileSystem.java:241)
at org.apache.hadoop.fs.ChecksumFileSystem$ChecksumFSOutputSummer.<init>(ChecksumFileSystem.java:335)
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:381)
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:364)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:564)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:545)
at org.apache.hadoop.hive.ql.io.orc.WriterImpl.ensureWriter(WriterImpl.java:1672)
at org.apache.hadoop.hive.ql.io.orc.WriterImpl.flushStripe(WriterImpl.java:1688)
at org.apache.hadoop.hive.ql.io.orc.WriterImpl.close(WriterImpl.java:1868)
at org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat$OrcRecordWriter.close(OrcOutputFormat.java:95)
at org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat$OrcRecordWriter.close(OrcOutputFormat.java:80)
at org.apache.hadoop.mapred.MapTask$DirectMapOutputCollector.close(MapTask.java:833)
at org.apache.hadoop.mapred.MapTask.closeQuietly(MapTask.java:1763)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:439)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:366)
at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:223)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
14/09/02 11:23:26 INFO mapred.LocalJobRunner: Map task executor complete.
14/09/02 11:23:26 WARN mapred.LocalJobRunner: job_local688970064_0001
java.lang.Exception: java.lang.NullPointerException
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:354)
Caused by: java.lang.NullPointerException
at org.apache.hadoop.hive.ql.io.orc.WriterImpl.createTreeWriter(WriterImpl.java:1515)
at org.apache.hadoop.hive.ql.io.orc.WriterImpl.<init>(WriterImpl.java:154)
at org.apache.hadoop.hive.ql.io.orc.OrcFile.createWriter(OrcFile.java:258)
at org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat$OrcRecordWriter.write(OrcOutputFormat.java:63)
at org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat$OrcRecordWriter.write(OrcOutputFormat.java:46)
at org.apache.hadoop.mapred.MapTask$DirectMapOutputCollector.collect(MapTask.java:847)
at org.apache.hadoop.mapred.MapTask$OldOutputCollector.collect(MapTask.java:591)
at ORCMapper.map(ORCMapper.java:42)
at ORCMapper.map(ORCMapper.java:1)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:430)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:366)
at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:223)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
14/09/02 11:23:26 INFO mapred.JobClient: map 0% reduce 0%
14/09/02 11:23:26 INFO mapred.JobClient: Job complete: job_local688970064_0001
14/09/02 11:23:26 INFO mapred.JobClient: Counters: 0
14/09/02 11:23:26 INFO mapred.JobClient: Job Failed: NA
java.io.IOException: Job failed!
at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1357)
at ORCDriver.main(ORCDriver.java:53)
해결법
-
==============================
1.다음 명령을 사용하여 orc 테이블에 텍스트 데이터를 삽입 할 수 있습니다.
다음 명령을 사용하여 orc 테이블에 텍스트 데이터를 삽입 할 수 있습니다.
insert overwrite table orcTable select * from textTable;
첫 번째 테이블은 orcTable이 다음 명령으로 작성됩니다.
create table orcTable(name string, city string) stored as orc;
그리고 textTable은 orcTable과 같은 구조입니다.
-
==============================
2.Spark 데이터 프레임을 사용하여 구분 된 파일을 orc 형식으로 쉽게 변환 할 수 있습니다. 스키마를 지정 / 부과하고 특정 열을 필터링 할 수도 있습니다.
Spark 데이터 프레임을 사용하여 구분 된 파일을 orc 형식으로 쉽게 변환 할 수 있습니다. 스키마를 지정 / 부과하고 특정 열을 필터링 할 수도 있습니다.
public class OrcConvert { public static void main(String[] args) { SparkConf conf = new SparkConf().setAppName("OrcConvert"); JavaSparkContext jsc = new JavaSparkContext(conf); HiveContext hiveContext = new HiveContext(jsc); String inputPath = args[0]; String outputPath = args[1]; DataFrame inputDf = hiveContext.read().format("com.databricks.spark.csv") .option("quote", "'").option("delimiter", "\001") .load(inputPath); inputDf.write().orc(outputPath); } }
모든 의존성이 충족되는지, HiveContext를 사용하기 위해 하이브가 실행되어야하는지, 현재 Spark ORC 형식으로 만 HiveContext에서만 지원되는지 확인하십시오.
from https://stackoverflow.com/questions/25117760/how-to-convert-txt-csv-file-to-orc-format by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] JDBC를 통한 Spark SQL과 Apache Drill 통합 (0) | 2019.06.17 |
---|---|
[HADOOP] Java를 사용하여 HDFS에서 파일 액세스 (0) | 2019.06.17 |
[HADOOP] Windows에서 실행 - 정확히 winutils가 무엇이며 왜 필요합니까? (0) | 2019.06.17 |
[HADOOP] hadoop mapreduce : java.lang.UnsatisfiedLinkError : org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy () Z (0) | 2019.06.17 |
[HADOOP] Hadoop으로 많은 수의 작은 파일 처리 (0) | 2019.06.17 |