hive中的数据定义语言(ddl):
hive中的数据定义语言有如下:
HiveQL DDL statements are documented here, including:
与mysql类似。
语法:
1.创建数据库:
create database/schama [if not exist] database_name
2.删除数据库
drop database/schama [if exist] database_name
3.使用数据库:
use database_name
4.创建表:
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name [(col_name data_type [COMMENT col_comment], ... [constraint_specification])]
PRIMARY KEY (col_name, ...) FOREIGN KEY (col_name, ...) REFERENCES table_name(col_name, ...) 默认是制表符为分隔符 (tab)
创建时出现的问题: message:For direct MetaStore DB connections, we don't support retries at the client level.
这是由于数据库字符编码引起的:alter database sparksql character set latin1; 这样可解决
创建的hive表默认的存储位置是Hadoop 上的/user/hive/warehouse文件夹下
可以使用location关键字指定表的位置 eg: create table tb(id int,name string) location 'hdfs上的存储位置'
5.加载数据
load data [local] inpath 文件路径' into table tablename ; 加上local是从本地文件中加载文件 不加local是从你的hdfs系统上加载文件
将数据加载到hive中发现数据未按照列名正确的进入表中,可以在创建表的时候添加如下一句:
row format delimited fields terminated by ',' 意思就是按照逗号分割数据放入对应表中对应的列中,若文件中的列数多余表中的,则多余的列不会添加到表中,若不加,则字段在不为string类型时加载进表中的数据会全部为null
6.将table中的数据按照某个分割符来分割,使用 lateral view explode(split(con,' ')) 函数 con为表中字段的名字
eg:
select word,count(1) from hive_wordcount lateral view explode(split(con,' ')) wc as word group by word;
7.修改表结构;
alter table tableName add columns (column type); hive
alter table tableName add column column type; mysql
8..将输出结果的null置换为别的值
hive中会有nal函数 nvl(p1,p2) 将p1转换为p2
9.设置hive不总是将任务提交为mr作业
可以在hive-site.xml文件中设置 hive.fetch.task.conversion=more
这样简单的hive任务就不会提交到hadoop运行
10.判断字段是否为null时最好使用is 或者is not 而不是使用==
11.hive中的函数
round() 保留数值中几位小数,并且四舍五入
ceil()向上取整
floor()向下取整
lower()将字符转换为小写
upper()将字符转换为大写
concat()链接两个字符串
substr(a,b)截取字符串
substr(a,b,c街区字符串 从b开始截,到c结束包含c位置
lpad(a,b,c)左填充,将a填充到b位字符串,使用c字符来填充
rpad(a,b,c)右填充
length(a) 字符长度
trim()去掉空格
size(map())返回map中元素的个数
cast(a as b) 将a转化为把这种数据格式
to_date() 返回日期中日期的部分
year()返回年的部分
month()返回月的部分
day()返回日的部分
weekofyear() 返回是今年的第几周
datediff()两个日期相差多少
date_sub()两个日期相减
date_add() 两个日期相加
coalesce()从左到右返回第一个不是null的结果
case..when..then 类似于if else语句 eg:select name,case name when 'lc' then name+'123' 当name为lc时返回lc123
count() sum() avg() min() max() 类似于mysql
explode(map()) 将map中的k,v拆成每条数据 eg:select explode(map(1,1))
hive的等值表连接 “ = ”
非等值链接 between a and b 查询a ,b之间的数据
还有左外连接,右外连接
group by 比较特殊:
select id,name count(*) from table group by id,name