Java API 读取Hive Orc文件

Java API 读取Hive Orc文件

转载:http://lxw1234.com/archives/2015/08/462.htm

Orc是Hive特有的一种列式存储的文件格式,它有着非常高的压缩比和读取效率,因此很快取代了之前的RCFile,成为Hive中非常常用的一种文件格式。

在实际业务场景中,可能需要使用Java API,或者MapReduce读写Orc文件。

本文先介绍使用Java API读取Hive Orc文件。

在Hive中已有一张Orc格式存储的表lxw1234:

Hive Orc

该表有四个字段:url、word、freq、weight,类型均为string;

数据只有5条:

Hive Orc

 

下面的代码,从表lxw1234对应的HDFS路径中使用API直接读取Orc文件:

 
 
  1. package com.lxw1234.test;
  2.  
  3. import java.util.List;
  4. import java.util.Properties;
  5.  
  6. import org.apache.hadoop.fs.Path;
  7. import org.apache.hadoop.hive.ql.io.orc.OrcInputFormat;
  8. import org.apache.hadoop.hive.ql.io.orc.OrcSerde;
  9. import org.apache.hadoop.hive.serde2.objectinspector.StructField;
  10. import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
  11. import org.apache.hadoop.mapred.FileInputFormat;
  12. import org.apache.hadoop.mapred.InputFormat;
  13. import org.apache.hadoop.mapred.InputSplit;
  14. import org.apache.hadoop.mapred.JobConf;
  15. import org.apache.hadoop.mapred.RecordReader;
  16. import org.apache.hadoop.mapred.Reporter;
  17.  
  18. /**
  19. * lxw的大数据田地 -- http://lxw1234.com
  20. * @author lxw.com
  21. *
  22. */
  23. public class TestOrcReader {
  24.  
  25. public static void main(String[] args) throws Exception {
  26. JobConf conf = new JobConf();
  27. Path testFilePath = new Path(args[0]);
  28. Properties p = new Properties();
  29. OrcSerde serde = new OrcSerde();
  30. p.setProperty("columns", "url,word,freq,weight");
  31. p.setProperty("columns.types", "string:string:string:string");
  32. serde.initialize(conf, p);
  33. StructObjectInspector inspector = (StructObjectInspector) serde.getObjectInspector();
  34. InputFormat in = new OrcInputFormat();
  35. FileInputFormat.setInputPaths(conf, testFilePath.toString());
  36. InputSplit[] splits = in.getSplits(conf, 1);
  37. System.out.println("splits.length==" + splits.length);
  38. conf.set("hive.io.file.readcolumn.ids", "1");
  39. RecordReader reader = in.getRecordReader(splits[0], conf, Reporter.NULL);
  40. Object key = reader.createKey();
  41. Object value = reader.createValue();
  42. List<? extends StructField> fields = inspector.getAllStructFieldRefs();
  43. long offset = reader.getPos();
  44. while(reader.next(key, value)) {
  45. Object url = inspector.getStructFieldData(value, fields.get(0));
  46. Object word = inspector.getStructFieldData(value, fields.get(1));
  47. Object freq = inspector.getStructFieldData(value, fields.get(2));
  48. Object weight = inspector.getStructFieldData(value, fields.get(3));
  49. offset = reader.getPos();
  50. System.out.println(url + "|" + word + "|" + freq + "|" + weight);
  51. }
  52. reader.close();
  53. }
  54.  
  55. }
  56.  

将上面的代码打包成orc.jar;

在Hadoop客户端机器上运行命令:

export HADOOP_CLASSPATH=/usr/local/apache-hive-0.13.1-bin/lib/hive-exec-0.13.1.jar:$HADOOP_CLASSPATH

hadoop jar orc.jar com.lxw1234.test.TestOrcReader /hivedata/warehouse/liuxiaowen.db/lxw1234/

运行结果如下:

 
 
  1. [liuxiaowen@dev tmp]$ hadoop jar orc.jar com.lxw1234.test.TestOrcReader /hivedata/warehouse/liuxiaowen.db/lxw1234/
  2. 15/08/18 17:03:37 INFO log.PerfLogger:
  3. 15/08/18 17:03:38 INFO Configuration.deprecation: mapred.input.dir is deprecated. Instead, use mapreduce.input.fileinputformat.inputdir
  4. 15/08/18 17:03:38 INFO orc.OrcInputFormat: FooterCacheHitRatio: 0/1
  5. 15/08/18 17:03:38 INFO log.PerfLogger:
  6. splits.length==1
  7. 15/08/18 17:03:38 INFO orc.ReaderImpl: Reading ORC rows from hdfs://cdh5/hivedata/warehouse/liuxiaowen.db/lxw1234/000000_0 with {include: null, offset: 0, length: 712}
  8.  
  9. http://cook.mytv365.com/v/20130403/1920802.html|未找到|1|5
  10.  
  11.  
  12. http://cook.mytv365.com/v/20130403/1920802.html|网站|1|3
  13.  
  14.  
  15. http://cook.mytv365.com/v/20130403/1920802.html|广大|1|3
  16.  
  17.  
  18. http://cook.mytv365.com/v/20130403/1920802.html|直播|1|3
  19.  
  20.  
  21. http://cook.mytv365.com/v/20130403/1920802.html|精彩|1|3
  22.  

结果没有问题。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Java中使用SparkSQL读取Hive数据可以通过以下步骤实现: 1. 创建SparkSession对象 ```java SparkSession spark = SparkSession.builder() .appName("ReadHiveData") .master("local") .enableHiveSupport() .getOrCreate(); ``` 2. 使用SparkSession对象创建DataFrame ```java Dataset<Row> df = spark.sql("SELECT * FROM my_table"); ``` 3. 显示DataFrame中的数据 ```java df.show(); ``` 完整代码示例: ```java import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.apache.spark.sql.SparkSession; public class ReadHiveData { public static void main(String[] args) { SparkSession spark = SparkSession.builder() .appName("ReadHiveData") .master("local") .enableHiveSupport() .getOrCreate(); Dataset<Row> df = spark.sql("SELECT * FROM my_table"); df.show(); } } ``` ### 回答2: SparkSQL是Spark生态系统中的一种高级数据处理引擎,能够处理结构化的数据,包括读取、转换、过滤、聚合和持久化等操作。为了方便数据分析,SparkSQL提供了读取Hive数据的功能,使得用户能够在不离开Spark环境的情况下访问和操作Hadoop集群中的数据。 首先,为了将SparkSQL与Hive进行连接,我们需要在Spark中配置Hive的元数据存储位置和版本等信息,以便SparkSQL能够通过这些信息访问Hive表。在创建SparkSession时,我们需要设置以下选项: ``` SparkSession.builder() .appName("SparkSQLHiveExample") .config("hive.metastore.uris", "thrift://localhost:9083") .enableHiveSupport() .getOrCreate(); ``` 其中,hive.metastore.uris参数指定Hive元数据处理程序的URI(Uniform Resource Identifier)地址,enableHiveSupport()则表示启用Hive支持。 接着,我们可以通过SparkSession来访问Hive表。例如,我们可以使用类似SQL语句的方式来查询Hive表: ``` val df = spark.sql("SELECT * FROM myHiveTable") ``` 上面的代码会返回一个DataFrame对象,其中包含myHiveTable中所有的行和列。 除了基本的查询操作,SparkSQL还支持更复杂的操作,例如使用JOIN、过滤器、聚合和窗口函数等。SparkSQL也可以将查询结果保存到Hive表中,以便以后进行检索和分析: ``` df.write.mode("overwrite").saveAsTable("newHiveTable") ``` 上面的代码将df数据保存到一个名为newHiveTable的Hive表中。 总体来说,使用SparkSQL读取Hive数据非常方便,只需要设置好元数据和Hive支持选项后即可直接访问Hive表。由于SparkSQL支持复杂的查询和数据操作,因此可以帮助用户更加高效地处理和分析Hadoop集群中的数据。 ### 回答3: Java SparkSQL读取Hive数据是使用SparkSQL APIJava语言将Hive数据读取到Spark中进行处理和分析的过程。SparkSQL是Spark的一个模块,它提供了一种基于结构化数据的数据处理和分析方法。而Hive是基于Hadoop的数据仓库,它提供了一个SQL-like的查询接口来查询和分析Hadoop中的数据。 在Java SparkSQL中读取Hive数据首先需要建立SparkSession实例,创建连接。使用SparkSession的builder()方法可以创建一个SparkSession Builder对象,然后可以通过设置相关的配置参数来创建SparkSession实例。其中的master()方法是指定Spark集群的Master地址,appName()方法是设置应用程序的名称。 在配置参数设置完成后,我们可以使用SparkSession的read()方法读取Hive表。读取数据时应指定数据源格式和表名。在这里,我们使用SparkSession的jdbc()方法将Hive表名与Hive元数据库连接起来,并设置相关的参数,包括数据库名称、Hive服务地址、Hive连接地址等。 读取Hive表后,我们可以使用SparkSQL的API进行数据处理和分析。SparkSQL提供了很多常用的操作,如filter()、groupBy()、join()等。这些操作可以针对Spark SQL DataFrames进行操作,实现各种计算和数据分析。当然,数据处理完成后,我们也可以将数据写回到Hive中,实现数据的持久化和数据共享。 需要注意的是,使用Java SparkSQL读取Hive数据需要确保Hive服务已经启动。并且,在使用SparkSQL读取Hive数据时,需要指定Hadoop的相关环境变量以便正确地加载Hadoop和Hive相关的类库。此外还需要注意Spark版本和Hive版本之间的兼容性,以避免因版本不匹配而导致的异常情况的发生。 总体而言,Java SparkSQL读取Hive数据是一种基于大数据生态系统的数据处理和分析方法,它能够实现高效地读取和处理Hive中的数据,为数据科学家和研究人员提供了丰富的工具和方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值