重要 | mr使用hcatalog读写hive表

浪尖 浪尖聊大数据

本文主要是讲mapreduce使用HCatalog读写hive表。

hcatalog使得hive的元数据可以很好的被其它hadoop工具使用,比如pig,mr和hive。

HCatalog的表为用户提供了(HDFS)中数据的关系视图,并确保用户不必担心他们的数据存储在何处或采用何种格式,因此用户无需知道数据是否以RCFile格式存储, 文本文件或sequence 文件。

它还提供通知服务,以便在仓库中有新数据可用时通知工作流工具(如Oozie)。

HCatalog提供HCatInputFormat / HCatOutputFormat,使MapReduce用户能够在Hive的数据仓库中读/写数据。 它允许用户只读取他们需要的表和列的分区。 返回的记录格式是方便的列表格式,用户无需解析它们。

下面我们举个简单的例子。

在mapper类中,我们获取表schema并使用此schema信息来获取所需的列及其值。

下面是map类。

public class onTimeMapper extends Mapper {   @Override   protected void map(WritableComparable key, HCatRecord value,    org.apache.hadoop.mapreduce.Mapper.Context context)    throws IOException, InterruptedException {    // Get table schema    HCatSchema schema = HCatBaseInputFormat.getTableSchema(context);    Integer year = new Integer(value.getString("year", schema));    Integer month = new Integer(value.getString("month", schema));    Integer DayofMonth = value.getInteger("dayofmonth", schema);    context.write(new IntPair(year, month), new IntWritable(DayofMonth));   }}

在reduce类中,会为将要写入hive表中的数据创建一个schema。

public class onTimeReducer extends Reducer {public void reduce (IntPair key, Iterable value, Context context)  throws IOException, InterruptedException{ int count = 0; // records counter for particular year-month for (IntWritable s:value) {  count++; } // define output record schema List columns = new ArrayList(3); columns.add(new HCatFieldSchema("year", HCatFieldSchema.Type.INT, "")); columns.add(new HCatFieldSchema("month", HCatFieldSchema.Type.INT, "")); columns.add(new HCatFieldSchema("flightCount", HCatFieldSchema.Type.INT,"")); HCatSchema schema = new HCatSchema(columns); HCatRecord record = new DefaultHCatRecord(3); record.setInteger("year", schema, key.getFirstInt());  record.set("month", schema, key.getSecondInt()); record.set("flightCount", schema, count); context.write(null, record);}}

最后,创建driver类,并且表明输入输出schema和表信息。

public class onTimeDriver extends Configured implements Tool{   private static final Log log = LogFactory.getLog( onTimeDriver.class );   public int run( String[] args ) throws Exception{    Configuration conf = new Configuration();    Job job = new Job(conf, "OnTimeCount");    job.setJarByClass(onTimeDriver.class);    job.setMapperClass(onTimeMapper.class);    job.setReducerClass(onTimeReducer.class);    HCatInputFormat.setInput(job, "airline", "ontimeperf");    job.setInputFormatClass(HCatInputFormat.class);    job.setMapOutputKeyClass(IntPair.class);    job.setMapOutputValueClass(IntWritable.class);    job.setOutputKeyClass(Text.class);    job.setOutputValueClass(DefaultHCatRecord.class);    job.setOutputFormatClass(HCatOutputFormat.class);    HCatOutputFormat.setOutput(job, OutputJobInfo.create("airline", "flight_count", null));    HCatSchema s = HCatOutputFormat.getTableSchema(job);    HCatOutputFormat.setSchema(job, s);    return (job.waitForCompletion(true)? 0:1);   }   public static void main(String[] args) throws Exception{ int exitCode = ToolRunner.run(new onTimeDriver(), args); System.exit(exitCode);}}

当然,在跑上面写的代码之前,应该先在hive中创建输出表。

create table airline.flight_count(Year INT ,Month INT ,flightCount INT)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;

可能会引起错误的地方是没有设置$HIVE_HOME.
[完]

©著作权归作者所有:来自51CTO博客作者mob604756ed02fe的原创作品,如需转载,请注明出处,否则将追究法律责任

你的鼓励让我更有动力

赞赏

0人进行了赞赏支持

更多相关文章

  1. mysqldump备份数据库出现(Couldn't execute 'SHOW VARIABLES LIKE
  2. 2021年哪款BI软件比较好用?
  3. 入门大数据必读
  4. oracle12c安装
  5. 2021年了,还依赖PC端报表?推荐几款好用的移动报表软件给你!
  6. 去哪儿网快速App开发及问题解决平台实践
  7. mysql数据库题目
  8. Vue.js基础入门系列(二)数据绑定
  9. JavaScript中的数据类型转换

随机推荐

  1. Android音频传输、接收与播放遇到的问题,
  2. 四极管:I2CTools编译方法
  3. android 常用第三方类库汇总
  4. 关于Android4.0之上的ListView显示从网络
  5. ViewPager中的错误片段接收onContextItem
  6. Android Studio Gradle 缓存文件夹设置
  7. 使用Android保护RESTful服务的最佳方式
  8. latch(用于等待异步响应)冻结WebView(和UI)
  9. Android自定义View流程
  10. android datepickerdialog 怎样在第一次