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. 超简单工具puer——“低碳”的前后端分离开发

    本文由作者郑海波授权网易云社区发布. 前几天,跟一同事(MIHTool作者)讨教了一下开发调试工具.其实个人觉得相较于定制一个类似MIHTool的Hybrid App容器,基于长连的B/S架构的工具其 ...

  2. 廖雪峰Python学习笔记——序列化

    序列化 定义:程序运行时所有变量都存在内存中,把变量从内存中变成可存储或可传输的过程称为序列化pickling,在其他语言中称为serialization,marshalling,flattening ...

  3. Good Bye 2017 C. New Year and Curling

    Carol is currently curling. She has n disks each with radius r on the 2D plane. Initially she has al ...

  4. webstrom 一直反复indexing

    从网上找了找答案 好多说 把大的静态文件exclude(在项目文件上右击-->Mark Directory As -->exclude)出去,可是不管用.我刚发生的情况是一直刷新,一遍一遍 ...

  5. Zookeeper之Curator(1)客户端基本的创建,删除,更新,查找操作api

    Curator Framework提供了简化使用zookeeper更高级的API接口.它包涵很多优秀的特性,主要包括以下三点: 自动连接管理:自动处理zookeeper的连接和重试存在一些潜在的问题: ...

  6. 【wireshark】插件开发(一):概述

    1. 概述 wireshark提供了灵活的插件机制,使用户可以方便地扩展wireshark的功能.插件的功能主要包括,但不限于协议解析器. 可以使用Lua或C语言来编写Wireshark插件,下表对比 ...

  7. 二叉排序树的理解和实现(Java)

    二叉排序树的定义和性质 二叉排序树又称二叉排序树.它或者是一个空树,或者是一个具有下列性质的二叉树: 若它的左子树不空,则左子树上所有节点的值均小于它的根结构的值 若它的右子树不空,则右子树上所有结点 ...

  8. SQL Server数据库——数据库的数据导出与数据导入

    http://jingyan.baidu.com/article/3c48dd34531d5de10be358b8.html

  9. (转)python 判断数据类型

    原文:https://blog.csdn.net/mydriverc2/article/details/78687269 Python 判断数据类型有type和isinstance 基本区别在于: t ...

  10. (转)AIX下镜像制作与取消,更换硬盘问题

    AIX下镜像制作与取消,更换硬盘问题 ROOTVG做镜像问题: 下面命令全部在AIX5.4上运行通过 # lspv hdisk0      000a1ddc7f36a2f0      rootvg   ...