微信搜索lxw1234bigdata | 邀请体验:数阅–数据管理、OLAP分析与可视化平台 | 赞助作者:赞助作者

Java写本地ORC文件(Hive2 API)

Hive lxw1234@qq.com 32019℃ 19评论

Hive2.0以后,使用了新的API来读写ORC文件(https://orc.apache.org)。
本文中的代码,在本地使用Java程序生成ORC文件,然后加载到Hive表。
代码如下:

package com.lxw1234.hive.orc;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
import org.apache.orc.CompressionKind;
import org.apache.orc.OrcFile;
import org.apache.orc.TypeDescription;
import org.apache.orc.Writer;

public class TestORCWriter {

	public static void main(String[] args) throws Exception {
		//定义ORC数据结构,即表结构
//		CREATE TABLE lxw_orc1 (
//		 field1 STRING,
//		 field2 STRING,
//		 field3 STRING
//		) stored AS orc;
		TypeDescription schema = TypeDescription.createStruct()
				.addField("field1", TypeDescription.createString())
		        .addField("field2", TypeDescription.createString())
		        .addField("field3", TypeDescription.createString());
		//输出ORC文件本地绝对路径
		String lxw_orc1_file = "/tmp/lxw_orc1_file.orc";
		Configuration conf = new Configuration();
		FileSystem.getLocal(conf);
		Writer writer = OrcFile.createWriter(new Path(lxw_orc1_file),
				OrcFile.writerOptions(conf)
		          .setSchema(schema)
		          .stripeSize(67108864)
		          .bufferSize(131072)
		          .blockSize(134217728)
		          .compress(CompressionKind.ZLIB)
		          .version(OrcFile.Version.V_0_12));
		//要写入的内容
		String[] contents = new String[]{"1,a,aa","2,b,bb","3,c,cc","4,d,dd"};
		
		VectorizedRowBatch batch = schema.createRowBatch();
		for(String content : contents) {
			int rowCount = batch.size++;
			String[] logs = content.split(",", -1);
			for(int i=0; i<logs.length; i++) {
				((BytesColumnVector) batch.cols[i]).setVal(rowCount, logs[i].getBytes());
				//batch full
				if (batch.size == batch.getMaxSize()) {
				    writer.addRowBatch(batch);
				    batch.reset();
				}
			}
		}
		writer.addRowBatch(batch);
		writer.close();
		
	}

}

将该程序打成普通jar包:orcwriter.jar
另外,本地使用Java程序执行依赖的Jar包有:

commons-collections-3.2.1.jar
hadoop-auth-2.3.0-cdh5.0.0.jar
hive-exec-2.1.0.jar
slf4j-log4j12-1.7.7.jar
commons-configuration-1.6.jar
hadoop-common-2.3.0-cdh5.0.0.jar
log4j-1.2.16.jar
commons-logging-1.1.1.jar
hadoop-hdfs-2.3.0-cdh5.0.0.jar
slf4j-api-1.7.7.jar

run2.sh中封装了执行命令:

#!/bin/bash

PWD=$(dirname ${0})
echo "PWD [${PWD}] .."

JARS=`find -L "${PWD}" -name '*.jar' -printf '%p:'`
echo "JARS [${JARS}] .."

$JAVA_HOME/bin/java -cp ${JARS} com.lxw1234.hive.orc.TestORCWriter $*

执行./run2.sh

orc

在Hive中建表并LOAD数据:

orc

可以看到,生成的ORC文件可以正常使用。

大多情况下,还是建议在Hive中将文本文件转成ORC格式,这种用JAVA在本地生成ORC文件,属于特殊需求场景。

 

抱歉,只有对本文发表过评论才能阅读隐藏内容。

如果觉得本博客对您有帮助,请 赞助作者

转载请注明:lxw的大数据田地 » Java写本地ORC文件(Hive2 API)

喜欢 (19)
分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(19)个小伙伴在吐槽
  1. 很不错的文章,多谢分享。
    iamlyg2016-09-26 22:03 回复
    • 受教了
      wzw2019-11-27 17:23 回复
  2. 多谢分享
    sss2016-10-17 16:10 回复
  3. 不错的
    FelixZh2016-11-10 09:22 回复
  4. 哈哈
    yejixiansheng2017-01-17 22:23 回复
  5. 很不错的文章,多谢分享。好好学习!
    elbert2017-02-13 15:22 回复
  6. 很不错的文章,谢谢
    用手指头去想2017-08-07 15:04 回复
  7. 可以
    an2018-05-10 18:43 回复
  8. 非常不错!!!!!!!!!!
    梓喵2018-11-19 21:44 回复
  9. 非常好的的文章!!
    轻音梓喵2018-11-25 15:06 回复
  10. 不错,简单易懂
    艺术硕士2019-01-03 18:09 回复
  11. 想知道所导入的jar包是自己封装的还是官方提供的,很多jar包我搜不到
    过路人2019-05-14 09:17 回复
  12. 很不错的文章,多谢分享
    1232019-08-14 13:59 回复
  13. 很不错很不错,谢谢分享
    龙一文字2020-04-03 16:42 回复
  14. 学习
    ayan2020-06-19 11:24 回复
  15. 评论才能查看隐藏内容???
    帅逼2020-06-24 16:47 回复
  16. 有问题,应该是 for(int i=0; i<logs.length; i++) { ((BytesColumnVector) batch.cols[i]).setVal(rowCount, logs[i].getBytes()); //batch full } if (batch.size == batch.getMaxSize()) { writer.addRowBatch(batch); batch.reset(); }
    2222021-08-21 18:13 回复
  17. 还有隐藏内容!!
    richter2022-01-01 08:47 回复
  18. 厉害
    伟大的shark2022-06-22 14:16 回复