*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条