Hadoop 权威指南学习笔记(十一)

                             HIVE

HiveQL 一般是大小写无关的(除了字符串比较以外)
hive 新建表:
ROWFORMAT 子句是 HiveQL所特有的。这个子句所声明的是数据文件的每一行是由制表符分隔的文本。 Hive 按照:  每行三个字段,分别对应于表中的三列, 字段间以制表符分隔 每行以换行符分隔,这一格式读取数据。
LOADDATA 语句中的 OVERWRITE 关键字告诉 Hive 删除表所对应目录中已有的所有文件。 如果省去这一关键字, Hive 就简单地把新的文件加入目录(除非目录下正好有同名的文件,否则将替换掉原有的同名文件)。
 

配置Hive

hive的配置文件为hivesite.xml , 可以通过传递 -config 选项参数给 hive 命令以重新定义 Hive 查找 hive-site.xml, Hive 还允许你向 hive 命令传递 -hiveconf 选项来为单个会话(session)设置属性。从(1)-(6)优先级依次降低:

(1)Thrift Clients

Hive的Server是基于Apache Thrift的,所以支持thrift客户端的查询请求

(2)JDBC Client

允许使用Java通过JDBC driver连接Hive,JDBC driver使用Thrift与Hive进行通信的

(3)ODBC Client

Hive的ODBC driver允许使用基于ODBC协议的应用来连接Hive,与JDBC driver类似,ODBC driver也是通过Thrift与Hive server进行通信的

  • Hive Driver

Hive Driver接收来自客户端提交的HQL语句,创建session handles,并将查询发送到Compiler(编译器)。

  • Hive Compiler

Hive的Compiler解析查询语句,编译器会借助Hive的metastore存储的元数据信息,对不同的查询块和查询表达式执行语义分析和类型检查,然后生成执行计划。

编译器生成的执行计划就是DAG,每个Stage可能代表一个MR作业。

  • Optimizer(优化器)

比如列裁剪、谓词下推等优化,提升查询效率

Metastore

metastore是 Hive 元数据的集中存放地。 metastore 包括两部分:服务和后台数据的存储,默认情况下, metastore 服务和 Hive 服务运行在同一个 JVM 中,它包含一
个内嵌的以本地磁盘作为存储的 Derby 数据库实例。
使用内嵌 metastore Hive 入门最简单的方法。但是, 只使用一个内嵌 Derby 数据库每次只能访问一个磁盘上的数据库文件 ,这也就意味着你一次只能为每个metastore 打开一个 Hive 会话。

更进一步,还有一种 metastore 配置称为"远程 metastore" 。在这种配置下 ,一个或多个 metastore 服务器和 Hive 服务运行在不同的进程内 因为这样一来, 数据库层可以完全置于防火墙后,客户端则不需要数据库凭证(用户名和密码) , 从而提供更好的可管理性和安全。 可以通过把 hive.metastore.local 设为false ,hive.metastore.uris 设为 metastore 服务器 URI( 如果有多个服务器,各个 URI 之间用逗号分隔),来把 Hive 服务设为使用远程 metastore。 metastore 服务器 URI 的形式为 thr ift://host:port。
端口号对应于启动 metastore 服务器时所设定的 METASTORE_PORT 值。
 

hive和传统数据库的区别:

在传统数据库里,表的模式是在数据加载时强制确定的。 如果在加载时发现数据不 符合模式,则拒绝加载数据。 因为数据是在写入数据库时 对照模式进行检查,  因此
这一设计有时被称为" 写时模式 "。 Hive 对数据的验证并不在加载数据时进行,而在查询时进行。这称 为" 读时模式 "。
 
更新、事务和索引都是传统数据库最重要的特性。但是,直到最近hive 也还没有考虑支持这些特性。因为 Hive 被设计为用 MapReduce 操作 HDFS 数据。在这样的环境下, "全表扫描" (full-table scan)是常态操作,而表更新则是通过把数据变换后放入新表实现的。目前hive索引分为两类:紧凑索引和位图索引。
紧凑索引存储每个值的HDFS块号,不会占用太多的磁盘空间。位图索引使用压缩的位集合来存储具有某个特殊值的行,这种索引适合取值可能性较少的字段,如性别。

HiveQL

数据类型

 
Describe function length;了解某个特定函数的使用帮助,hive不会反向转化类型,除非使用cast,强制转化失败会返回NULL
内部表和外部表:内部表Hive管理数据,hive会把数据移动到仓库目录下(warehouse directory),外部表是hive到仓库目录以外的位置访问数据,两者之间的区别的drop的时候, 内部表会把元数据和数据一起删除,外部表只会删除元数据,
 
分区并不包含在hive的表的数据中,可以把分区当做一个目录,在写数据的时候创建目录,并把数据写进去
桶:把表(或分区)组织成桶 (bucket) 有两个理由。第一个理由是获得更高的查询处理效 率,把表划分成桶的第二个理由是使"取样" (sampling) 更高效。
下列语句把表划分为桶(指定划分为桶的列和桶的个数):
CREATE TABlE bucketed_user (id INT , name STRING)
ClUSTERED BY (id) INTO 4 BUCKETS
Hive 并不检查数据文件中的桶是否和表定义中的桶一致(无论是对于桶的数量或用于划分桶的列)。如果两者不匹配,在查询时可能会碰到错误或未定义的结果。要向分桶表中填充成员, 需要将 hive.enforce.bucketing 属性设置为 true 。这样, Hive 就知道用表定义中声明的数量来创建桶。
 

存储格式

"行格式" (row format) 和"文件格式" (file format) 。行格式指行和一行中的字段如何存储。按照 Hive 的术语,行格式的定义由 SerDe 定义。 SerDe 是"序列化和反序列化工具" (Serializer-Deserializer) 合成词。
默认的行内分隔符不是制表符,而是 ASCII 控制码集合中的 Control-A,"集合" (co Il ection) 元素的默认分隔符为字符 Control-B
Hive 中, 可以在 CREATE TABLE 语句中通过 声明 STORED AS SEQUENCEFILE 来使用顺序文件。 使用 序列文件一个主要的优点是它们支持可分割 (splittable) 的压缩。 Hive 提供了另一种二进制存储格式,称为 RCFile ,表示按列记录文件。 面向列的存储布局 (colunm-driented layout) 方式可以使一个查询跳过那些不必访问的列。
 
 
Hive 不允许 INSERT INTO...VAL USES...形式的语句。多表插入,同时可以插入多个表数据,提高效率,源表一个,目标表多个
HIVE 一定不能在数据中间插入字段,因为更改表只是更改元数据,并不会更改目录下的数据
 
order  by  是全排序, sort by 每个reducer进行排序,局部排序
 
视图只是可读的,无法插入数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值