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. pageadmin CMS网站制作教程:模板中的站点数据调用

    pageadmin CMS网站建设教程:模板中的站点数据调用 1.获取当前站点Id,返回int数字 Html.CurrentSiteId() 2.获取当前站点url地址,返回string字符串 Htm ...

  2. JavaScript学习知识点归纳

    JavaScript学习包括几大方面: 1.基础语法 2.JavaScript核心对象 3.DOM操作 4.BOM操作 5.正则表达式 6.AJAX 7.面向对象编程 以下依次为各版块相关内容==&g ...

  3. maven項目創建紅叉

    出现问题的原因: 解决方案: 在pom.xml中配置jdk的版本

  4. Python(socketserver并发聊天)

    day27 一个server与多个client聊天. server.py import socketserver class MyServer(socketserver.BaseRequestHand ...

  5. 查询改写(Query Rewrite)方法总结

    为何需要Query改写 Query分析是搜索引擎的一个重要模块,对搜索结果的覆盖率和相关性至关重要.搜索引擎的检索过程包含了两个重要的阶段:匹配和排序.匹配也叫召回,表示根据用户的查询条件,尽可能多地 ...

  6. StormUI详解

    StormUI由Cluster Summary,topology summary,supervisor summary,Nimbus Configuration四部分组成,如下图所示: Cluster ...

  7. HTML+Javascript制作拼图小游戏详解(二)

    上一篇我们说了网页的基本布局.接下来将为大家带来具体的实现方法. 拼图通表格来实现,做一个方形的表格,改变其大小使之如图所示. 试想一下如果我们将一张图片剪成6张分别放入对应位置,然后再把它打乱,这样 ...

  8. linux安装git,linux安装jenkins

    首先是两个地址,分别是git的版本下载地址,jenkins的下载地址 https://mirrors.edge.kernel.org/pub/software/scm/git/ http://mirr ...

  9. POJ 1018

    #include<iostream> #define MAXN 105 #define inf 10000000 #include<vector> #include<io ...

  10. error 'there is already an open datareader associated with this command which must be closed first'

    This can be easily solved by allowing MARS in your connection string. Add MultipleActiveResultSets=t ...