Hive知识点总结-02

*hive-hql

 1.数据类型
   数值型:int
           DECIMAL、DOUBLE
   字符串:string
   日期类型:date(毫秒),timestamp(纳秒)

 2.数据定义语法:DDL (重要)
   表的定义
   表结构的修改
   数据库对象:table、view、index、trigger(触发器)、procedure存储过程、function、constraint(约束)

   table
   Create/Drop/Alter/Use Database
   Create/Drop/Truncate Table
   Alter Table/Partition/Column
-----------------------------------------------------
   Create/Drop/Reload Function


   namespace:很多软件技术都会使用namespace(命名空间),它的主要作用是用来做 数据或程序 隔离的
             做隔离的好处:1.权限控制,2.防止命名冲突
   常见的namespace:package
                    数据库上的:database、schema
                    mq:频道channel

   drop table:删除表
   truncate table:清空表,只删除表中的数据,保留表的定义 ,释放空间(id重新从1开始)
   delete from table:删除表数据 ,不释放空间(id连着以前的数字继续)


truncate 与delete 比较:
truncate table 在功能上与不带 WHERE 子句的 delete语句相同:二者均删除表中的全部行。
truncate 比 delete速度快,且使用的系统和事务日志资源少。
truncate 操作后的表比Delete操作后的表要快得多。
当表被清空后表和表的索引讲重新设置成初始大小,而delete则不能。 
  
delete数据其实是行级别操作,可以回滚
truncate是表级别操作,不可回滚

   create table的形式
   1.create table table_name
     (col1 type1,col2 type2,col3 type3)
     row fromat delimited
     LINES TERMINATED BY '\n'
     FIELDS TERMINATED BY ' ';
   2.create table pokers_clone like pokes
     表克隆,只赋值表结构,不复制表数据
   3.create table as select ...

     create table pokers1 as
     select * from pokes where foo>3

   row format:数据行的格式定义
   delimited:分割符
   serder:序列化反序列化类

   TEMPORARY:临时表修饰
           temporary表创建出来只能被当前session访问
           当session断开或消失的时候temporary表会被hive自动删除

           限制:
                不支持表分区
                不支持创建索引
   EXTERNAL:外部表修饰
           外部表:允许用户创建的表的数据在hive的文件夹外部自由指定
                   如果删除外部表,源数据文件不会被删除,只是删除元数据
                   创建外表时一般通过在ddl后加
                   LOCATION '<hdfs_location>'的形式来指定该表所存放的文件夹位置
                   一般不使用load data的形式来加载数据
           内部(managed)表:表所对应文件夹由hive自己维护
                              drop表时源数据文件和元数据同时都会被删除

           load data:它的作用实质就是文件的剪切

           一般情况下外来数据,或者原始数据都创建成外部表
           在hive里面通过代码分析产生的数据一般都简称内部表

*hive表创建定义加载文件格式化的方式
 1.delimited 指定分隔符,简单易用,但是限制比较多
 2.serder    序列化反序列化,功能比较强,使用比较复杂  常用的有:正则serder

*hive表的分区和分桶
 [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
 [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
*hive的数据文件格式
 STORED AS file_format

 常用的文件格式
 TEXTFILE  一般数据源会是文本格式
 ORC       hive里面最常用的一种文件格式
 PARQUET   impala里常用的一种文件格式

*hive查看表元数据信息
describe user_action_login   --只有字段信息
describe extended user_action_login  --详细信息
describe formatted user_action_login --格式化后的详细信息

*TBLPROPERTIES表的属性配置
比方说该表是否要压缩
      该表是否支持事务等
*修改表
ALTER TABLE table_name RENAME TO new_table_name; --表重命名

ALTER TABLE table_name SET TBLPROPERTIES table_properties;  --设置表的属性配置
ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comment);

ALTER TABLE table_name CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name, ...)]
  INTO num_buckets BUCKETS;  --把原来不是分桶表的表,改成是分桶表的表

ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];
                             --修改表的分区操作

*hive创建函数
CREATE FUNCTION [db_name.]function_name AS class_name
  [USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];
  DROP FUNCTION [IF EXISTS] function_name;
 3.数据操作语法:DML (重要)
DML: Load, Insert, Update, Delete

load:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

overwrite:覆盖并加载
local:添加local是path指向的是执行该语句的机器本地的文件目录
      不加local时path指向的是hdfs的目录
insert:
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;

insert into aaa (col1,col2,col3) values(value1,value2,value3)

-------------------------
create table user_new_tweet like user_action_m;
create table action_log_192_184_237_49 like user_action_m;

insert overwrite table user_new_tweet
select * from user_action_m
where action_type='new_tweet';

insert overwrite table action_log_192_184_237_49
select * from user_action_m
where ip='198.184.237.49';

优化的写法:
from user_action_m
insert overwrite table user_new_tweet select * where action_type='new_tweet'
insert overwrite table action_log_192_184_237_49 select * where ip='198.184.237.49'
-------------------------

使用insert把数据写出到hdfs的文件系统中


update、delete:

hive中只有支持事务管理(ACID)的表才能进行update和delete
如果想让一个表支持事务管理需要满足如下条件:
1.表的存储格式必须是ORC
2.表必须要进行分桶
3.表的属性上必须要配置:transactional=true
4.当前连接hiveserver的session必须要设置一些参数:
  set hive.support.concurrency=true;
  set hive.exec.dynamic.partition.mode=nonstrict;
  set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;

Import/Export

应用场景:
dml是对数据进行表级别操作
Import/Export主要是用作对数据的备份和恢复

 4.数据查询语法:DQL (最重要)



 5.数据库控制语法:DCL (不重要)


mysql的数据备份和恢复指令
mysqldump -uroot -psa dbname>backupfile.sql
mysql -uroot -psa dbname<backupfile.sql
-----------------------------------------------------------------------
*select
 select关键词的后面可以添加哪些内容
 1.*
 2.具体的一个或多个字段名称
 3.函数
 4.常量
 5.字段和数据运算表达式

*hbase的scan中rowkey的限定
在hbase中对rowkey添加startrowkey和stoprowkey,hbase对rowkey的比较过程是按照字节来进行比较的

-233223332
【0x00】【0x00】【0x32】【0x33】【0x33】【0x33】【0x33】【0x33】
1
【0x00】【0x00】【0x00】【0x00】【0x00】【0x00】【0x00】【0x01】
hbase的rowkey是按照字节的字典顺序来进行比较的,因此在限定范围时,要按照字节来限定,而不是某个数据类型的限定方式。

hbase的rowkey最好设计成字符串类型,因为rowkey的比较默认情况下是按照字典顺序来进行比较

*hbase过滤器
 在关系型数据库我们添加条件去查询数据时,通常在sql中添加where语句如:
 select * from tableA where col1=123
 select * from tableA where col1>123

 hbase中的过滤器就等同于关系型sql中where语句
 在过滤数据计算上需要做两件事情:
 1.比较计算,比较规则
 2.取数规则,过滤规则,比较的什么结果的数据会被过滤掉

 在hbase上的比较过滤器里面,需要用户提供两个组件:
 1.比较器
 2.运算符

hbase的过滤器有两种类型:
1.比较过滤器
  底层的过滤器,可以通过对hbase表扫数据时添加扫描限定条件从而获取想要的数据内容
2.专有过滤器
  是对比较过滤器的封装,是比较过滤器的简写

1.比较器的类型
  BinaryComparator 二进制比较器,用于按字典顺序比较 Byte 数据值 (> < =)
  BinaryPrefixComparator 前缀二进制比较器,按前缀比较 (like 'xxx%')
  NullComparator 判断给定的是否为空   (is null)
  BitComparator  按位比较
  RegexStringComparator  正则比较
  SubstringComparator    子串比较

2.运算符的类型
  LESS                           < 
  LESS_OR_EQUAL        <=
  EQUAL                        =
  NOT_EQUAL               <>
  GREATER_OR_EQUAL >=
  。。。

3.比较过滤器类型
  RowFilter,对rowkey进行过滤的过滤器,满足条件的整行数据都会被提取
  FamilyFilter,对表的列簇进行过滤,只有满足比较条件的family下的数据才会被提取
  QualifierFilter,对满足列成员名称的数据提取出来,只有该列成员的列名称满足条件的数据会被提取
  ValueFilter,对列值进行比较查询的过滤器,只有满足该条件的单元格数据才会被提取
  如果相对数据的时间进行限制过滤查询的话可以使用:setTimeRange

4.装有过滤器
  PrefixFilter,相当于,过滤器:RowFilter
                        比较器:BinaryPrefixComparator
                        操作符:EQUAL

  ColumnPrefixFilter,相当于,过滤器:QualifierFilter
                              比较器:BinaryPrefixComparator
                              操作符:EQUAL
  MultipleColumnPrefixFilter,多子列前缀过滤器,指定多个qualifier的过滤器
  DependentColumnFilter,综合子列过滤器

*比较过滤器的使用步骤
 1.定义比较器对象,对象描述表里的什么字段和什么值进行比较,怎样比较(按字节或按位比较或者包含)
 2.使用比较器再加上运算符创建出过滤器对象
 3.定义scan对象,然后把过滤器对象设置到scan对象上
 4.获取table对象,调用table的getScanner方法,把scan作为参数,即可获取过滤扫描的结果



人员信息表
人员的基本信息、人员联系方式信息
基本信息:姓名、性别、年龄、身份证号 。。。
联系方式:电话
          邮寄地址

person_info
i                       c
name                    phone_1
gender                  phone_2
age                     mail_1
id_card                 mail_2

查询出person_info里面所有的电话号
c列簇下的qialify like 'phone_%'
QualifyFilter

*FuzzyRowFilter对rowkey进行指定字节位置处的数据进行模糊匹配比较
比方说:
rowkey:UserID + CreateTime + FileID
rowkey长度: 6 + 8 + 8 字节
我们只对时间进行限制查询,可以使用fuzzyFilter对rowkey上第6个字节开始到13个字节的数据
和给定的时间来进行比较
FuzzyRowFilter在每一个fuzzyFilter比较值之间接受两个参数,
第二个参数用来保证哪个位置处的数据会被比较
第一个参数用来提供比较值
【x】【f】【ee】【a】【3】【3】    【2】【0】【1】【8】【0】【1】【0】【2】     【x】【x】【x】【x】【x】【x】【x】【x】

提取日期=20180312的数据
第一个参数:
【x】【x】【x】【x】【x】【x】    【2】【0】【1】【8】【0】【3】【1】【2】     【x】【x】【x】【x】【x】【x】【x】【x】
第二个参数:
【1】【1】【1】【1】【1】【1】    【0】【0】【0】【0】【0】【0】【0】【0】     【1】【1】【1】【1】【1】【1】【1】【1】




作业:实现hbase的分页查询
分页查询,查询条件:当前页码pageIndex  每页的数据量:pageSize


从第(pageIndex-1)*pageSize条开始取数据
取pageSize条记录
public getInfoByPage(int pageIndex,int pageSize){

}

hbase上如何实现:
1.PageFilter:看一下就行了
2.获取到ResultScanner
  然后空掉ResultScanner的next()方法,掉用(pageIndex-1)*pageSize,不取数据
  然后从下一个next处开始取数据,然后取pageSize条



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值