欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hive SQL

程序员文章站 2022-05-18 17:16:26
...

Hive数据类型

数据类型 注释
TINYINT -128 to 127
SMALLINT -32,768 to 32,767
INT -2,147,483,648 to 2,147,483,647
BIGINT -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
FLOAT 4-byte single precision floating point number
DOUBLE 8-byte double precision floating point number
STRING 字符串
VARCHAR 可变长度字符串
CHAR 字符
arrays 数组类型
maps 键值对集合类型
structs 结构化类型

Hive表的类型

    hive表可分为:内部表、外部表、临时表、分区表、分桶表

1.内部表

1.建表
方式一:

CREATE TABLE gfstbl(
  id INT,
  name STRING,
  age INT,
  gfs ARRAY<STRING>,
  address MAP<STRING,STRING>,
  info STRUCT<country:String,province:String,city:String>
)
ROW FORMAT DELIMITED  
FIELDS TERMINATED BY ' ' 
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':' 
LINES TERMINATED BY '\n';
#可以设置源数据的位置,若不设置就在hive的工作目录区
#LOCATION "/test"

方式二:

#只是创建表结构
create table gfstbl1 like gfstbl;

方式三:

# 会创建相应的表结构,并且插入数据
create table gfstbl2 AS SELECT id,name,gfs,address from gfstbl; 

2.加载数据
方式一:
    insert新数据
方式二:
    load

load data local inpath '/root/gfs.txt' into table gfstbl;

方式三:
    查询其它表数据insert到新表中

from day_hour_table
insert into rest 
	select count(*) from day_hour_table;

习惯写法 from提前 减少SQL代码的冗余
使用yarn命令干掉某一个application:
yarn application -kill job_*

2.外部表

1.建表

create external table wc_external 
   (word1 STRING, 
   word2 STRING) 
   ROW FORMAT DELIMITED 
   FIELDS TERMINATED BY ' ' 
   location '/test/external';

小知识:
1.将本地文件(格式与表格式一致)上传到工作目录区,查询这个表,数据量增多
2.将工作目录区中的文件再次添加到这个表中,发现数据量没有增加
3.将hdfs中其他目录下的文件load进表中,数据量增加,但是原文件本剪贴了

3.临时表

    临时表的声明周期是一次会话
1.建表

create TEMPORARY table ttabc(id Int,name String)

进入hive shell创建一张表,关闭shell后,表丢失

shell都遵循repl机制:
    r:read,读
    e:evaluate,计算
    p:print,打印
    l:loop,循环
临时表不支持分区

4.分区表

    分区表分为静态分区表和动态分区表
1.分区原因
    防止暴力扫描全表,提高查询效率

2.静态分区表
2.1单区分表
2.1.1建表

create table day_table (
	id int, 
	content string
)
 partitioned by (dt string) 
 ROW FORMAT DELIMITED 
 FIELDS TERMINATED BY '\t' ;

2.1.2加载数据
    方式一:insert
    方式二:load
2.1.3删除分区

ALTER TABLE day_table DROP PARTITION (dt="9-27");

2.2多区分表
2.2.1建表

create table day_hour_table (
	id int, 
	content string
)
 partitioned by (dt int,hour int) 
 ROW FORMAT DELIMITED 
 FIELDS TERMINATED BY '\t' ;

2.3创建/添加分区

ALTER TABLE table_name 
ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location']
[, PARTITION partition_spec [LOCATION 'location'], ...];

3.动态分区表
    静态分区表的分区是用户指定的,不够灵活,业务场景比较局限。而动态分区可以根据数据本身的特征自动来划分分区。
3.1建表
    建表方式与静态分区表一样

CREATE TABLE gfstbl_dynamic(
  id INT,
  name STRING,
  gfs ARRAY<STRING>,
  address MAP<STRING,STRING>,
  info STRUCT<country:String,province:String,shi:String>
)
partitioned by (sex string,age INT)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ' ' 
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':' 
LINES TERMINATED BY '\n';

3.2加载数据
    使用insert
动态分区表不能使用load加载数据。load只是将数据上传到HDFS指定目录中
3.3查看分区数

show partitions gfstbl_dynamic;

5.分桶表

    应用场景:随机、join
1.标准
    分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储
    由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中
    对于hive中每一个表、分区都可以进一步进行分桶

2.建表

CREATE TABLE psnbucket( id INT, name STRING, age INT) 
CLUSTERED BY (age) INTO 4 BUCKETS 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

3.加载数据
    方式一:insert

4.抽样

select * from psnbucket tablesample(bucket 1 out of 4 on age);

5.分区表+分桶表
5.1建表

CREATE TABLE psnbucket_partition( id INT, name STRING, age INT) 
PARTITIONED BY(height DOUBLE) 
CLUSTERED BY (age) INTO 4 BUCKETS 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

5.2加载数据
    方式一:insert

多个分区中的对应的位置的小文件组成一个桶

5.3抽样

select * from psnbucket tablesample(bucket 1 out of 4 on age);

视图

    存储SQL执行数据

1.特点

    1.不支持物化视图
    2.只能查询,不能做记载数据操作
    3.视图的创建,只是保存一份元数据,查询视图时才执行对应的子查询
    4.view定义中若包含了order by/limit语句,当查询视图时也会进行boder by/limit语句操作,view当中定义的优先级更高
    5.view支持迭代视图
    6.一旦创建成功,无法修改
创建视图时不会启动MapReduce任务,但是查询时会启动MapReduce任务

2.语句

1.创建视图

CREATE VIEW  IF NOT EXISTS  view1 AS SELECT * FROM logtbl order by age;

2.查看已经创建的视图

show tables

3.删除视图

drop view view1

索引

    优化查询性能
1.创建索引库
    索引库用于存放索引

create index t2_index 
on table psnbucket_partition(age) 
as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' 
with deferred rebuild 
in table t2_index_table;

索引库中只是保存一些元数据

2.创建索引信息
    索引信息存储在索引库中,若索引库有新增数据,也可以使用以上语句重建索引

3.查看索引

show index on psnbucket_partition;

4.删除索引

drop index t2_index on psnbucket_partition; 

删除索引的同时,索引库也会被删除

数据读取规则

    之前让hive中加载的数据时比较工整的,字段与字段之间都是分割好的,每一个字段都不是脏数据,并且每一个字段都是有意义的。但这种情况太过于理想,实际运行中可能并不如人意

1.正则表达式

    使用正则表达式对每一条信息进行处理
1.建表

 CREATE TABLE logtbl (
    host STRING,
    identity STRING,
    t_user STRING,
    time STRING,
    request STRING,
    referer STRING,
    agent STRING)
  ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
  WITH SERDEPROPERTIES (
    "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) \\[(.*)\\] \"(.*)\" (-|[0-9]*) (-|[0-9]*)"
  )
  STORED AS TEXTFILE;

2.加载数据
    方式一:load
    方式二:insert
原始脏数据不会变,只是在读的时候,将脏数据清理掉再显示出来

上一篇: hive sql

下一篇: hive sql使用总结