AmosCloud

Library

Have a Question?

If you have any question you can ask below or enter what you are looking for!

Hive_day02

Hive

1.DDL

-- 创建库
create database db2 comment "xxx";
-- 查看库的信息
desc database db2;
db_name comment location owner_name owner_type parameters
bd2 this is db2 hdfs://bd0201:9000/user/hive/warehouse/bd2.db root USER
  • 注意location是这个库默认的hdfs存储路径
  • 如果启动hdfs服务和启动hive服务使用的用户不同,有可能出现建库时报权限不足的错误,处理方法
    1. 使用hdfs dfs -chmod 777 /user/hive/warehouse /tmp
    2. 或者更改使用相同的用户
-- 查看详细信息
desc database extended bd2;
-- 删除数据库(database),默认只能删除空的数据库
drop database db2;
-- 强行删除非空数据库
drop database db2 cascade;
--       外部表           判断是否存在
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
-- 列名     数据类型    增加列的备注       ,字段2 类型2 ....
[(col_name data_type [COMMENT col_comment], ...)]
-- 给表添加注释
[COMMENT table_comment]
-- 分区
[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]
-- 设置行的格式 比如字段分隔符
[ROW FORMAT row_format]
-- 设置文件的保存格式 默认是Text
[STORED AS file_format]
-- 设置存储的位置 默认是在对应库的目录下
-- 我们可以自定义这个目录
-- 在生产环境中,很多时候,原始数据上传到hdfs之后,目录是固定的,并且一般不是/user/hive/warehouse,我们使用Location可以避免数据的频繁移动,直接使用原始数据
[LOCATION hdfs_path]

2.DML

核心概念

1 分区表

  • 场景
    一个Hive中的表,每天会有新的数据加入
    我们查询时,做如下查询
    select * from du where date="xxxx-xx-xx";

    • 问题:当前查询是否会加载全表数据
    • 解释:因为Hive使用MR处理数据
      当我们查询一个表时,无论where条件怎么写,都会将全表的数据加载到MR中
      Driver(FileInputFormat.inputPath("hdfs://bd0201:9000/mytables/du/"))
      where的条件会被翻译到Mapper中做过滤
    • 缺点:所有的查询都会加载全表数据
    • 解决方案:我们可以将表中的数据,按照想要划分的维度进行目录的切分,例如以日期为维度划分目录
      hdfs://bd0201:9000/mytables/du/
      hdfs://bd0201:9000/mytables/du/2020-09-30/du.txt du1.txt du2.txt
      hdfs://bd0201:9000/mytables/du/2020-10-01/du.txt du1.txt du2.txt
      hdfs://bd0201:9000/mytables/du/2020-10-02/du.txt du1.txt du2.txt
  • 分区表的概念
    将Hive中的表以某个字段进行分割,分成多个分区,每个分区对应单独的目录,这些分区目录都存储在表所在的路径下

  • 分区表的使用

    1. 建表时设置分区字段

      create external table du_partitioned(
      brandName  string,
      seriesName  string,
      productId  string,
      shoesName  string,
      shoesPrice  string,
      shoesPayment  string,
      shoesComment  string,
      chuanda  string,
      brand  string,
      `number`  string,
      price  string,
      `function`  string,
      color  string,
      high  string,
      sale_deta  string,
      sizePrice string)
      partitioned by (dt string)
      row format delimited fields terminated by '\t';
    2. 导入数据时指定分区

      -- 第一种方式:使用load data 加上parition关键字
      -- 指定当前加载的数据需要加载到哪个分区
      load data local inpath '/root/du.txt' into table du_partitioned partition (dt="2020-09-30");
      load data local inpath '/root/du.txt' into table du_partitioned partition (dt="2020-10-01");
      load data local inpath '/root/du.txt' into table du_partitioned partition (dt="2020-10-02");
    3. 查询时设置分区条件
      在使用时,我们可以把分区字段当作一个表的列来操作
      可以直接在where条件中使用 字段名=字段值或者任何条件操作
      但是要注意,在底层上,分区字段并不是表的内容,而是一个目录的名字

    4. 多级分区
      多级分区,本质上就是目录的嵌套,可以更细粒度的划分数据的存储

      -- 创建一个表 使用年嵌套月的形式创建二级分区
      create external table stu(name string,age int)
      partitioned by (year string,month string)
      row format delimited fields terminated by ' ';

2. hive使用Linux和hdfs

  • 在Hive命令行下 在命令前加上!就可以直接使用linux命令
  • 在Hive命令行下 可以省略hdfs不写,直接使用dfs -命令执行hdfs命令