Hive数据结构

除了基本数据类型(与java类似),hive支持三种集合类型

Hive集合类型数据

array、map、structs

hive (default)> create table test(
              > name string,
              > friends array<string>,
              > children map<string,int>,
              > address struct<street:string,city:string>)
              > row format delimited        -- 限制多个字段分段符
              > fields terminated by ','    -- 字段之间以','分割
              > collection items terminated by '_'  -- 字段内部用'_'分割(包括array、map)
              > map keys terminated by ':'          -- map内key-value用':'
              > lines terminated by '\n';           -- 不同行,用回车'\n'

按表格式,写一份数据,传到hdfs对应的hive-test表下,

Lili,bingbing_xinxin,Lucifa:18_Jack:19,Nanjing_Beijing

然后查询数据库,即可得到查询结果;


test.name       test.friends        test.children           test.address
Lili        ["bingbing","xinxin"]   {"Lucifa":18,"Jack":19} {"street":"Nanjing","city":"Beijing"}
  • 所以Hive的数据,一定是要按设计的格式,严格排列才能读取的!!!

查询集合数据

hive (default)> select friends[0] from test;    -- 可以像java数组那样访问
OK
bingbing

查询map数据

hive (default)> select children['Lucifa'] from test;    -- 只能用key来访问
OK
18

查询结构体数据

hive (default)> select address.street from test;        -- address.street访问
OK
street
Nanjing

DDL操作

库、表的增删改查

数据库

  1. 创建数据库

除了location参数,其他跟mysql一样,支持like,desc

hive (default)> create database if not exists hive;
OK
-- 同时HDFS增加文件/user/hive/warehouse/hive.db
hive (default)> create database if not exists hive location /hive;
OK
-- 自定义创建的数据库在HDFS的路径
-- 查看库信息
hive (default)> desc database hive;
OK
db_name comment location    owner_name  owner_type  parameters
hive        hdfs://master:9000/user/hive/warehouse/hive.db  whr USER
  1. 修改数据库

无法修改数据库名和目录位置;

alter

  1. 删库
-- 库必须为空
hive (default)> drop database test;
-- 强制删除cascade
hive (default)> drop database test cascade;

  1. 查看一下表信息
hive (default)> show create table test;
​
CREATE TABLE `test`(
  `name` string, 
  `friends` array<string>, 
  `children` map<string,int>, 
  `address` struct<street:string,city:string>)
ROW FORMAT DELIMITED    --分隔符
  FIELDS TERMINATED BY ',' 
  COLLECTION ITEMS TERMINATED BY '_' 
  MAP KEYS TERMINATED BY ':' 
  LINES TERMINATED BY '\n' 
STORED AS INPUTFORMAT   --输入格式
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT            --输出格式
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION                --存储位置
  'hdfs://master:9000/user/hive/warehouse/test'
TBLPROPERTIES (         
  'transient_lastDdlTime'='1569750450')
  1. 内部表(管理表)、外部表

内部表:删除,同时删除元数据和hdfs数据;

外部表:删除,只会删除元数据信息,不删hdfs数据;

修改student内部表为外部表:

alter table student set tblproperties('EXTERNAL'='TRUE');--后面必须大写

修改外部表为内部表:

alter table student set tblproperties('EXTERNAL'='False');

查询表类型

desc formatted student;
  1. 分区表

避免暴力扫描;

一个分区就是hdfs上的一个独立文件夹;Hive的分区就是hdfs的目录分割;

创建一个分区表:(在元数据PARTITIONS表中存有分区信息)

hive (default)> create table dept_partition(
              > deptno int,dname string, loc string)
              > partitioned by (month string)   -- 以month分区,month默认也算作一个字段
              > row format delimited fields terminated by '\t';

加载数据:

load data [local] inpath 'path'  [overwrite] into table [partition_psc];
local:
    有==>从linux本地加载数据
    无==>从hdfs加载数据,相当于执行mv操作(无指的是没有local参数时,而不是本地中没有这个文件)
overwrite
    有==>覆盖掉表中原来的数据
    无==>在原来的基础上追加新的数据
<pre class="md-fences md-end-block ty-contain-cm modeLoaded">查询:
-- 分区查询where
hive (default)> select * from dept_partition where month = '2019-9-31';

单独添加分区

-- 可添加多个分区
hive (default)> alter table dept_partition add partition(month='2019-9-29') partition(month='2019-9-28');

删除分区

-- add改成drop,每个分区间加 ','
hive (default)> alter table dept_partition drop partition(month='2019-9-29'),partition(month='2019-9-28');
<pre class="md-fences md-end-block ty-contain-cm modeLoaded">查看有多少分区
hive (default)> show partitions dept_partition;

标签: default, 更新, hdfs, 数据库, partition, month, hive, Hive, test

相关文章推荐

添加新评论,含*的栏目为必填