《Hive编程指南》一1.3 Java和Hive:词频统计算法

1.3 Java和Hive:词频统计算法

如果用户不是Java工程师,那么可以直接跳到下一节。

如果用户是名Java工程师,那么可能需要阅读本节,因为用户需要为其所在组织的Hive用户提供技术支持。你可能会质疑如何使用Hive解决自己的工作。如果是这样的话,那么可以先看看下面这个实现了之前我们所讨论的Word Count算法的例子,我们先学会使用Java MapReduce API,然后再学习如何使用Hive。

通常都会使用Word Count作为用户学习使用Java编写MapReduce程序的例子,因为这样用户可以关注于API。因此,Word Count已经成为Hadoop世界中的“Hello World”程序了。

Apache Hadoop 分支版本中包含有下面的这个Java实现[8]。如果读者并不了解Java(但是你仍在读本节内容的话),也不必担心,我们提供这个代码只是为了方便用户进行大小对比。

package org.myorg;

import java.io.IOException;
import java.util.*;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

public class WordCount {

public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
  private final static IntWritable one = new IntWritable(1);
  private Text word = new Text();

  public void map(LongWritable key, Text value, Context context)
   throws IOException, InterruptedException {
    String line = value.toString();
    StringTokenizer tokenizer = new StringTokenizer(line);
    while (tokenizer.hasMoreTokens()) {
      word.set(tokenizer.nextToken());
      context.write(word, one);
     }
   }
}

  public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
    public void reduce(Text key, Iterable<IntWritable> values, Context context)
     throws IOException, InterruptedException {
      int sum = 0;
      for (IntWritable val : values) {
        sum += val.get();
       }
       context.write(key, new IntWritable(sum));
    }
}

public static void main(String[] args) throws Exception {
  Configuration conf = new Configuration();

  Job job = new Job(conf, "wordcount");

  job.setOutputKeyClass(Text.class);
  job.setOutputValueClass(IntWritable.class);

  job.setMapperClass(Map.class);
  job.setReducerClass(Reduce.class);

  job.setInputFormatClass(TextInputFormat.class);
  job.setOutputFormatClass(TextOutputFormat.class);

  FileInputFormat.addInputPath(job, new Path(args[0]));
  FileOutputFormat.setOutputPath(job, new Path(args[1]));

  job.waitForCompletion(true);
 }
}

上面是一个有63行的Java代码。我们不会详细解释其中的API[9]。如下是使用HiveQL进行的相同的运算,这时只有8行代码,而且不需要进行编译然后生成一个“JAR”(Java压缩包)文件。

CREATE TABLE docs (line STRING);

LOAD DATA INPATH 'docs' OVERWRITE INTO TABLE docs;
CREATE TABLE word*counts AS
SELECT word, count(1) AS count FROM
 (SELECT explode(split(line, '\s')) AS word FROM docs) w
GROUP BY word
ORDER BY word;

我们稍后会解释所有这些HiveQL语法。

在上面两个例子中,都是使用尽可能简单的方法将文件中的内容分割成单词,也就是按照空格进行划分的。这个方法不能很好地处理标点,同时也不能识别同一个单词的单数和复数形式,等等。不过,这里这么使用已经可以达到我们的目的了。[10]

借助Java API可以定制和调整一个算法实现的每个细节。不过,大多数情况下,用户都不需要这个级别的控制,而且当用户需要控制所有那些细节时也会相当地放慢用户的开发进度。

如果你不是一名程序员,那么也就用不着写Java MapReduce代码了。不过,如果你已经熟悉SQL了,那么学习Hive将会相当地容易,而且很多程序也都很容易快速实现。

时间: 2024-12-05 07:10:01

《Hive编程指南》一1.3 Java和Hive:词频统计算法的相关文章

《Hive编程指南》一导读

前 言 Hive编程指南本书是一本Hive的编程指南.Hive是Hadoop生态系统中必不可少的一个工具,它提供了一种SQL(结构化查询语言)方言,可以查询存储在Hadoop分布式文件系统(HDFS)中的数据或其他和Hadoop集成的文件系统,如MapR-FS.Amazon的S3和像HBase(Hadoop数据库)和Cassandra这样的数据库中的数据. 大多数数据仓库应用程序都是使用关系数据库进行实现的,并使用SQL作为查询语言.Hive降低了将这些应用程序转移到Hadoop系统上的难度.凡

《Hive编程指南》一第1章 基础知识

第1章 基础知识 Hive编程指南从早期的互联网主流大爆发开始,主要的搜索引擎公司和电子商务公司就一直在和不断增长的数据进行较量.最近,社交网站也遇到了同样的问题.如今,许多组织已经意识到他们所收集的数据是让他们了解他们的用户,提高业务在市场上的表现以及提高基础架构效率的一个宝贵的资源. Hadoop生态系统就是为处理如此大数据集而产生的一个合乎成本效益的解决方案.Hadoop实现了一个特别的计算模型,也就是MapReduce,其可以将计算任务分割成多个处理单元然后分散到一群家用的或服务器级别的

《Hive编程指南》—— 读后总结

知识图谱 本文转自博客园xingoo的博客,原文链接:<Hive编程指南>-- 读后总结,如需转载请自行联系原博主.

《Hive编程指南》一1.2 Hadoop生态系统中的Hive

1.2 Hadoop生态系统中的Hive WordCount算法,和基于Hadoop实现的大多数算法一样,有那么点复杂.当用户真正使用Hadoop的API来实现这种算法时,甚至有更多的底层细节需要用户自己来控制.这是一个只适用于有经验的Java开发人员的工作,因此也就将Hadoop潜在地放在了一个非程序员用户无法触及的位置,即使这些用户了解他们想使用的算法. 事实上,许多这些底层细节实际上进行的是从一个任务(job)到下一个任务(job)的重复性工作,例如,将Mapper和Reducer一同写入

《Hive编程指南》一1.4 后续事情

[1]不过,因为Hive是被设计用来处理的大数据集的,这个启动所消耗的时间和实际数据处理时间相比是微乎其微的. [2]请访问Apache HBase的官方网站,http://hbase.apache.org,以及Lars George(O'Reilly)所著的<HBase权威指南>一书. [3]请参考Cassandra的官方网站,http://cassandra.apache.org/,以及参考Edward Capriolo (Packt)所著的<High Performance Cas

《Hive编程指南》一1.1 Hadoop和MapReduce综述

1.1 Hadoop和MapReduce综述 如果用户已经熟悉Hadoop和MapReduce计算模型的话,那么可以跳过本节.虽然用户无需精通MapReduce就可以使用Hive,但是理解MapReduce的基本原理将帮有助于用户了解Hive在底层是如何运作的,以及了解如何才能更高效地使用Hive. 我们在这里提供了一个关于Hadoop和MapReduce的简要描述.更多细节,请参考Tom White (O'Reilly)所著的<Hadoop权威指南>一书. MapReduceMapReduc

《Spark 官方文档》Spark SQL, DataFrames 以及 Datasets 编程指南(一)

Spark SQL, DataFrames 以及 Datasets 编程指南 概要 Spark SQL是Spark中处理结构化数据的模块.与基础的Spark RDD API不同,Spark SQL的接口提供了更多关于数据的结构信息和计算任务的运行时信息.在Spark内部,Spark SQL会能够用于做优化的信息比RDD API更多一些.Spark SQL如今有了三种不同的API:SQL语句.DataFrame API和最新的Dataset API.不过真正运行计算的时候,无论你使用哪种API或语

Spark编程指南笔记

本文是参考Spark官方编程指南(Spark 版本为1.2)整理出来的学习笔记,主要是用于加深对 Spark 的理解,并记录一些知识点. 1. Spark介绍 Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce 框架,都是基于map reduce算法所实现的分布式计算框架,拥有Hadoop MapReduce所具有的优点:不同于MapReduce的是Job中间输出和结果可以保存在内存中,而不需要读写HDFS,因此Spark能更好地适用于machine l

《Spark 官方文档》Spark SQL, DataFrames 以及 Datasets 编程指南(四)

使用Spark SQL命令行工具 Spark SQL CLI是一个很方便的工具,它可以用local mode运行hive metastore service,并且在命令行中执行输入的查询.注意Spark SQL CLI目前还不支持和Thrift JDBC server通信. 用如下命令,在spark目录下启动一个Spark SQL CLI ./bin/spark-sql Hive配置在conf目录下hive-site.xml,core-site.xml,hdfs-site.xml中设置.你可以用