一区二区视频_久久久精品国产_一级在线观看_欧美福利_国产精品免费看_国产大片在线观看

當前位置: 首頁 / 技術(shù)干貨 / 正文
大數(shù)據(jù)開發(fā)為什么必須要學會Hive?

2023-02-16

   數(shù)據(jù) hive 開發(fā)

  我們需要知道,所謂的“大數(shù)據(jù)”,指的是非常龐大的數(shù)據(jù)集。在一般的中型企業(yè)中,數(shù)據(jù)的規(guī)模往往能夠輕松的到達PB的規(guī)模,更不用提大型的企業(yè)了。這些數(shù)據(jù)中蘊藏著非常豐富的價值,而大數(shù)據(jù)開發(fā)人員需要使用各種工具,對這樣的數(shù)據(jù)集進行高效率的處理,從而挖掘出其中蘊藏的價值,讓其發(fā)光發(fā)熱。于是要解決的第一個問題就是數(shù)據(jù)存儲的問題。龐大的數(shù)據(jù)集,造成了在一臺機器上存儲不下的問題,此時就需要使用分布式的數(shù)據(jù)存儲方式,而HDFS就是來解決這樣的問題而存在的。

  存儲的問題解決了,下面就是對這些數(shù)據(jù)進行計算、處理的問題了。我們需要對分布式文件系統(tǒng)上的數(shù)據(jù)文件進行計算,勢必會涉及到分布式計算的思想。但是如果在我們處理每一個需求的時候,都去從0開始開發(fā)一個分布式計算程序,會有很多的弊端。首先,對于開發(fā)人員來說,就是一個極大的學習成本,需要去了解到分布式計算的底層是如何實現(xiàn)的。其次,幾乎所有的分布式計算程序中,涉及到分布式計算的部分可以是共用的。因此只需要將這部分單獨的抽離出來即可,沒必要每一次做分布式計算程序的時候,都去關(guān)注底層的實現(xiàn)細節(jié)。于是就出現(xiàn)了MapReduce,解決了分布式計算的問題。

  MapReduce的出現(xiàn),確實在一定程度上簡化了開發(fā)人員的壓力,使得開發(fā)人員只需要將自己的工作重心放在業(yè)務(wù)邏輯的實現(xiàn)上面即可,不需要考慮到分布式計算的底層細節(jié)是如何實現(xiàn)的。但是,MapReduce的程序其實還是非常的麻煩的。想要去開發(fā)一個完整的MapReduce的程序,你必須設(shè)計至少3個類: Mapper、Reduer、Driver,而如果還需要處理更加復雜的數(shù)據(jù)的時候,可能還得設(shè)計分區(qū)器、自定義數(shù)據(jù)類型、Combiner、自定義分組等等類型,使得一個MR的程序非常的復雜。這還只是一個Job。如果你的業(yè)務(wù)邏輯比較復雜,此時可能還需要有多個Job串聯(lián),又大大的增加了開發(fā)的難度。于是,在此基礎(chǔ)上,Hive誕生了!

  Apache Hive是Apache旗下的頂級項目,是在大數(shù)據(jù)開發(fā)中非常非常熱門的組件,也是大數(shù)據(jù)開發(fā)必需要使用到的技術(shù)組件之一。什么是Hive呢?Hive是一個構(gòu)建在Hadoop上的數(shù)據(jù)倉庫工具(框架),可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射成一張數(shù)據(jù)表,并可以使用類SQL的方式對這樣的數(shù)據(jù)文件進行讀、寫以及管理的操作。有很多人在提到Hive的時候,都會把Hive稱為是一個數(shù)據(jù)庫。但是Hive只是一個數(shù)據(jù)計算的工具,并不是一個數(shù)據(jù)庫!

  而為什么一定要使用到Hive呢?其實使用Hive可以極大的簡化開發(fā)人員的開發(fā)成本,縮短項目周期。我們以一個案例為例,來對比一下MapReduce和Hive來處理同樣的需求的時候,有什么區(qū)別?

  案例:

  一個文件中記錄著手機流量的信息,記錄著手機號碼、MAC地址、訪問網(wǎng)址、上行流量、下行流量等信息。需要從這個文件中查詢出來每一個手機號碼的總上行、總下行、總流量信息。

  import org.apache.hadoop.io.IntWritable;

  import org.apache.hadoop.io.Text;

  import org.apache.hadoop.mapreduce.Reducer;

  import java.io.IOException;

  /**

  * @author 千鋒大數(shù)據(jù)教研院 - 章魚哥

  * @company 北京千鋒互聯(lián)科技有限公司

  */

  public class PhoneFlowReducer extends Reducer<text, text="" text,="" phoneflowbean,=""> {

  @Override

  protected void reduce(Text key, Iterablevalues, Context context) throws IOException, InterruptedException {

  // 定義一個變量,用來統(tǒng)計總流量

  int total = 0;

  int total_up = 0;

  int total_down = 0;

  // 遍歷每一個手機號碼對應(yīng)的一條流量信息

  for (PhoneFlowBean value : values) {

  total += value.getTotalFlow();

  total_up += value.getUpFlow();

  total_down += value.getDownFlow();

  }

  String res = String.format("%d\t%d\t%d", total_up, total_down, total);

  context.write(key, new Text(res));

  }

  }

  import org.apache.hadoop.io.LongWritable;

  import org.apache.hadoop.io.Text;

  import org.apache.hadoop.mapreduce.Mapper;

  import java.io.IOException;

  /**

  * @author 千鋒大數(shù)據(jù)教研院 - 章魚哥

  * @company 北京千鋒互聯(lián)科技有限公司

  */

  public class PhoneFlowMapper extends Mapper<longwritable, text,="" phoneflowbean=""> {

  @Override

  protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

  String[] props = value.toString().split("\t");

  // 拆出手機號碼

  String phoneNumber = props[1];

  // 拆出上行流量

  int upFlow = Integer.parseInt(props[8]);

  // 拆出下行流量

  int downFlow = Integer.parseInt(props[9]);

  PhoneFlowBean bean = new PhoneFlowBean(phoneNumber, upFlow, downFlow);

  context.write(new Text(phoneNumber), bean);

  }

  }

  import org.apache.hadoop.io.Text;

  import org.apache.hadoop.mapreduce.Reducer;

  import java.io.IOException;

  /**

  * @author 千鋒大數(shù)據(jù)教研院 - 章魚哥

  * @company 北京千鋒互聯(lián)科技有限公司

  */

  public class PhoneFlowReducer extends Reducer<text, text="" text,="" phoneflowbean,=""> {

  @Override

  protected void reduce(Text key, Iterablevalues, Context context) throws IOException, InterruptedException {

  // 定義一個變量,用來統(tǒng)計總流量

  int total = 0;

  int total_up = 0;

  int total_down = 0;

  // 遍歷每一個手機號碼對應(yīng)的一條流量信息

  for (PhoneFlowBean value : values) {

  total += value.getTotalFlow();

  total_up += value.getUpFlow();

  total_down += value.getDownFlow();

  }

  String res = String.format("%d\t%d\t%d", total_up, total_down, total);

  context.write(key, new Text(res));

  }

  }

  import org.apache.hadoop.conf.Configuration;

  import org.apache.hadoop.fs.Path;

  import org.apache.hadoop.io.IntWritable;

  import org.apache.hadoop.io.Text;

  import org.apache.hadoop.mapreduce.Job;

  import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

  import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

  import java.io.IOException;

  /**

  * @author 千鋒大數(shù)據(jù)教研院 - 章魚哥

  * @company 北京千鋒互聯(lián)科技有限公司

  */

  public class PhoneFlowDriver {

  public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {

  Configuration configuration = new Configuration();

  configuration.set("mapreduce.framework.name", "local");

  Job job = Job.getInstance(configuration);

  job.setMapperClass(PhoneFlowMapper.class);

  job.setReducerClass(PhoneFlowReducer.class);

  job.setJarByClass(PhoneFlowDriver.class);

  job.setMapOutputKeyClass(Text.class);

  job.setMapOutputValueClass(PhoneFlowBean.class);

  job.setOutputKeyClass(Text.class);

  job.setOutputValueClass(Text.class);

  FileInputFormat.setInputPaths(job, new Path("file/HTTP_20130313143750.dat"));

  FileOutputFormat.setOutputPath(job, new Path("file/out2"));

  System.exit(job.waitForCompletion(true) ? 0 : -1);

  }

  }

  看到了吧,用MapReduce實現(xiàn)上述需求的時候,需要設(shè)計至少3個類:Mapper、Reducer、Driver,有些復雜的需求還需要自定義序列化類型,例如上述的PhoneFlowBean類。那么使用Hive如何解決這個需求呢?

  # 建表

  CREATE TABLE flow(

  id string COMMENT 'this is id column',

  phonenumber string,

  mac string,

  ip string,

  url string,

  urltype string,

  uppacket int,

  downpacket int,

  upflow int,

  downflow int,

  issuccess int

  )

  COMMENT 'this is log table'

  ROW FORMAT DELIMITED

  FIELDS TERMINATED BY '\t'

  LINES TERMINATED BY '\n'

  stored as textfile;

  # 查詢結(jié)果

  select

  phonenumber,

  sum(upflow) total_up,

  sum(downflow) total_down,

  sum(upflow+downflow) total

  from

  flow

  group by

  phonenumber;

  看到了吧,使用Hive來做同樣的需求,就是這么簡單!對HDFS上的結(jié)構(gòu)化的數(shù)據(jù)文件進行表的映射,然后一條SQL就可以實現(xiàn)同樣的需求了!

  因此,當我們需要處理到非常復雜的需求的時候,使用Hive來進行數(shù)據(jù)的處理將會變得非常的簡單,可以極大的減少開發(fā)人員的開發(fā)壓力,縮短開發(fā)人員的開發(fā)周期!

好程序員公眾號

  • · 剖析行業(yè)發(fā)展趨勢
  • · 匯聚企業(yè)項目源碼

好程序員開班動態(tài)

More+
  • HTML5大前端 <高端班>

    開班時間:2021-04-12(深圳)

    開班盛況

    開班時間:2021-05-17(北京)

    開班盛況
  • 大數(shù)據(jù)+人工智能 <高端班>

    開班時間:2021-03-22(杭州)

    開班盛況

    開班時間:2021-04-26(北京)

    開班盛況
  • JavaEE分布式開發(fā) <高端班>

    開班時間:2021-05-10(北京)

    開班盛況

    開班時間:2021-02-22(北京)

    開班盛況
  • Python人工智能+數(shù)據(jù)分析 <高端班>

    開班時間:2021-07-12(北京)

    預約報名

    開班時間:2020-09-21(上海)

    開班盛況
  • 云計算開發(fā) <高端班>

    開班時間:2021-07-12(北京)

    預約報名

    開班時間:2019-07-22(北京)

    開班盛況
IT培訓IT培訓
在線咨詢
IT培訓IT培訓
試聽
IT培訓IT培訓
入學教程
IT培訓IT培訓
立即報名
IT培訓

Copyright 2011-2023 北京千鋒互聯(lián)科技有限公司 .All Right 京ICP備12003911號-5 京公網(wǎng)安備 11010802035720號

主站蜘蛛池模板: 天天草天天 | 天天插天天 | 视频在线一区二区 | 国产欧美久久一区二区三区 | 亚洲婷婷一区二区三区 | 日韩精品久久一区二区三区 | 日本在线一二 | 久久精品在线免费观看 | 国产日皮视频 | 成人在线视频网址 | 久久久精品欧美一区二区免费 | 日批视频免费 | 人人草人人| 狠狠的干 | 日韩精品在线电影 | 大陆一级毛片免费看 | 久久精品小视频 | 国产美女精品一区二区 | 久久99国产精品久久99大师 | 一区二区三区自拍 | 欧美一级片免费观看 | 日本在线观看视频一区 | 成人免费视频国产免费麻豆 | 日本在线中文 | 国产精品片aa在线观看 | 精品国产精品三级精品av网址 | 国产网站视频 | 麻豆高清免费国产一区 | 久久国产一区二区 | 国产成人午夜 | 日韩精品一区二区三区中文在线 | 欧美视频第一页 | 亚洲高清不卡视频 | 欧美高清免费 | 欧美天天 | 91在线观看视频 | 国产在线成人 | 久久久www成人免费精品 | 成人激情在线 | 作爱视频免费看 | 午夜视频在线免费观看 |