HDFS 中一个简单的 Join查询,是否需要撸一大串代码?我只会SQL语句 能不能入坑大数据?这里我们就来聊一聊 Hive。

Hive 是什么?

Hive 是一种数据仓库工具,不提供数据存储(数据还是存储在 HDFS 上),它能让你通过 SQL语句实现 MapReduce 统计。

Hive 是一个SQL解析引擎,是将SQL语句转译成 MapReduce 作业,然后在 Hadoop 平台上运行。

Hive 中的表是纯逻辑表,只有表的元数据,本质就是 Hadoop 的目录或文件。



Hive 一般读多写少,不支持对数据的改写和删除,它没有定义专门的数据格式,需要由用户指定,通常包括三个属性:

  • 列分割符,包括:空格、’,’、‘\t’。
  • 行分割符,一般为’\n’。
  • 读取文件数据的方法。

Hive 上的SQL和传统 SQL区别

HiveQL SQL
数据存储 HDFS、Hbase Local File System
数据格式 用户自定义 系统决定
数据更新 不支持,支持数据覆盖 支持
索引 有(0.8之后)
执行 MapReduce 计算模型 Executor
可扩展性 高(UDF、UDAF、UDTF)
数据规模
执行延迟
数据检查 读时模式 写时模式

Hive 架构



我们通过 Hive 的 Client(Hive 的命令行工具,JDBC等)向Hive 提交 SQL 命令,如果是创建数据表的数据定义语言(DDL),Hive 通过执行引擎 Driver 将数据表的信息记录在 Metastore 元数据组件中。

如果提交的是查询分析数据的数据查询语句(DQL),Driver 会将该语句提交给自己的编译器 Compiler 进行语法分析、语法解析、语法优化等一系列操作,最后生成 MapReduce 执行计划,然后根据执行计划生成一个 MapReduce 作业,提交给MapReduce 计算框架进行处理。

常用命令

一次执行多条查询语句,可以将这些查询语句保存在后缀为 hql 的文件中,然后通过下面的命令一次执行。

 hive -f XX.hql

使用 Hive 时,有时需要查看 HDFS,可以在 Hive 命令下,执行dfs 命令,如下:

dfs -ls /

语法梳理

数据类型

Hive 支持两种数据类型:原生类型复合类型。原生类型包括:TINYINT、SMALLINT、INT、BIGINT、BOOLEAN、FLOAT、DOUBLE、STRING、BINARY(0.8以上才可用)、TIMESTAMP(0.8以上才可用)。复合数据类型包括:ARRAY、MAP、STRUCT、UNION。

存储格式

Hive 支持的文件存储格式有

  • textfile(默认格式)
  • sequencefile(二进制格式)
  • refile
  • 自定义格式

一个 student 表的创建实例:

create table student (
name string,
age int,
cource array<string>,
body map<string,float>,
address struct<street:string,city:string,state:string>
)
row format delimited
fields terminated by '\001' --指定列分隔符
--collection items terminated by '\002' -- 指定集合元素间的分割符
--map keys terminated by '\003' -- 指定类型为 map 的字段的键值对分隔符
--lines terminated by '\n' -- 指定行分隔符
--stored as textfile -- 存储的文件格式
;

Hive 表

外部表

Hive 默认创建的是内部表,外部表创建语句如下:

create external table ...location '/xxx/xx/x'

关键字 external 指定了该表为外部表,location 指明了数据存放在 HDFS 的 ‘/xxx/xx/x’ 目录下。

当要删除外部表时,Hive 会认为没有完全拥有这份数据,只会删除该外部表的元数据信息,而不会删除该表的数据。

分区表

分区表的创建语句如下:

create table ...partitioned by ...

在分区表中,一个 partition 对应表下的一个目录。

桶(Bucket)

Hive 支持对每一个表或分区,进一步分桶,其创建语句示例如下:

create table bucket_user(
id int,
name string
)
clustered by (id) into 4 buckets;

Bucket 的主要作用包括:数据采样和提升某些查询操作效率。数据采样的语法示例如下:

select * from bucket_user tablesample(bucket 1 out of 2 on id);

tablesample(bucket x out of y) 中y必须是表中总bucket 数的倍数或因子,x表示从哪个bucket 开始抽。例如:表中总bucket 数为32,tablesample(bucket 3 out of 16),表示总共抽取2个(32/16)桶的数据,是第三个bucket 和第19(3+16)个bucket中的数据。

Join 和 Group by

一条常见的SQL语句,按照 MapReduce 编程模型,其 map 和 reduce 端输入和输出分别是什么?我们分析常见的两种:

  • group by
SELECT pageid, age, count(1) FROM pv_users GROUP BY pageid, age;



pageid, age 形成Key,count(1) 形成value,经过统计后在reduce输出端重新将 key 拆开与value生成三列。

  • join
SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON (pv.userid = u.userid);



join 中将 userid 作为key,value 为二元组<表编号,pageid/age>,shuffle 阶段,将相同的key 合并,reduce 输出是将 二元组<表编号,pageid/age>中ageid和age做笛卡尔积。

异常说明

ParseException line 2:0 cannot recognize input near ‘’ ‘’ ‘’

可能分号后面有空格导致的。

Hive 基础你需要掌握这些的更多相关文章

  1. 《Programming Hive》读书笔记(两)Hive基础知识

    <Programming Hive>读书笔记(两)Hive基础知识 :第一遍读是浏览.建立知识索引,由于有些知识不一定能用到,知道就好.感兴趣的部分能够多研究. 以后用的时候再具体看.并结 ...

  2. 【Hive】Hive 基础

    Hive架构: Hive基础 1 概念 1.1 简介 1.1.1 hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表, 并提供简单的sql查询功能,可以将sql语句 ...

  3. Hive基础(1)

    Hive基础(1) Hive的HQL(2) 1. Hive并不是分布式的,它独立于机器之外,类似于Hadoop的客户端. 2. 元数据和数据的区别,前者如表名.列名.字段名等. 3. Hive的三种安 ...

  4. [转帖]Hive基础(一)

    Hive基础(一) 2018-12-19 15:35:03 人间怪物 阅读数 234   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接 ...

  5. 【转】Hive 基础之:分区、桶、Sort Merge Bucket Join

    Hive 已是目前业界最为通用.廉价的构建大数据时代数据仓库的解决方案了,虽然也有 Impala 等后起之秀,但目前从功能.稳定性等方面来说,Hive 的地位尚不可撼动. 其实这篇博文主要是想聊聊 S ...

  6. Hive基础介绍

    HIVE结构 Hive 是建立在 Hadoop 上的数据仓库基础构架.它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储.查询和分析存储在 Hadoop 中的大规模数据的机 ...

  7. Hive基础知识梳理

    Hive简介 Hive是什么 Hive是构建在Hadoop之上的数据仓库平台. Hive是一个SQL解析引擎,将SQL转译成MapReduce程序并在Hadoop上运行. Hive是HDFS的一个文件 ...

  8. Hive基础讲解

      一.Hive背景介绍 Hive最初是Facebook为了满足对海量社交网络数据的管理和机器学习的需求而产生和发展的.马云在退休的时候说互联网现在进入了大数据时代,大数据是现在互联网的趋势,而had ...

  9. Hive基础之自定义封装hivefile命令

    存在的问题:当把hql写到shell中,不方便阅读:但把hql写到文件中,又传递不了参数:怎么办呢? 自定义hivefile 执行方式形如: 第一个参数为要执行的hql文件,后续的参数为要替换的key ...

  10. Hive基础之Hive开启查询列名及行转列显示

    Hive默认情况下查询结果里面是只显示值: hive> select * from click_log; OK ad_101 :: ad_102 :: ad_103 :: ad_104 :: a ...

随机推荐

  1. Day37 多进程

    什么是进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体: ...

  2. 用 python 修改文件中指定的行数

    #! /bin/python filename='setup.ini' lines=[] with open(filename,'r') as f: lines=f.readlines() lines ...

  3. 898. Bitwise ORs of Subarrays

    We have an array A of non-negative integers. For every (contiguous) subarray B = [A[i], A[i+1], ..., ...

  4. 688. Knight Probability in Chessboard

    On an NxN chessboard, a knight starts at the r-th row and c-th column and attempts to make exactly K ...

  5. hello lua

    http://manual.luaer.cn/ http://www.lua.org/pil/contents.html #include <cstdio> #include <st ...

  6. MiniUi-----Spinner 数值调节器(可以实现任意值的递增)

    Spinner 数值调节器可以实现任意值的递增,每次的递增值主要是通过increment="递增值"属性来控制的. 属性 该属性扩展自验证框(validatebox),下面是为微调 ...

  7. 浅析js中取绝对值的2种方法

    1.abs()   var aaa=-20;   var bbb=Math.abs(aaa); 2.加减法   var aaa=-20;   var bbb=-aaa

  8. mysql优化器在统计全表扫描的代价时的方法

    innodb 的聚集索引 的叶子结点 存放的 是 索引值以及数据页的偏移量 那么在计算全表扫描的代价是怎么计算的呢? 我们知道代价 为 cpu代价+io代价 cpu代价 就是 每5条记录比对 计算一个 ...

  9. CPM(Cluster Percolation method)派系过滤算法

    一.概念 (1)完全子图/全耦合网络/k-派系:所有节点全部两两相连 图1 这些全耦合网络也成为派系,k-派系表示该全耦合网络的节点数目为k 1)k-派系相邻:两个不同的k-派系共享k-1个节点,认为 ...

  10. constructor 属性返回变量或对象的构造函数。判断是否为日期,数组的例子

    constructor 属性返回变量或对象的构造函数. <!DOCTYPE html> <html> <head> <meta charset="u ...