导航

Hive语法

Posted on 2019-07-31 20:17  两张10元钱  阅读(153)  评论(0编辑  收藏  举报
  • Hive数据模型

  

   DataBases:和关系型数据库中的数据库一样
   Tables:和关系型数据库中的表一样
   Partitions(可选):一些特殊的列,用于优化数据的存储和查询
   Files:实际数据的物理存储单元

  • 数据类型

  

  

   支持的很多类型同一般的数据库大部分相同,但是里边有特殊类型:如struct、map、array

  • 数据定义语句(DDL)

   Create/Drop/Alter Database
   Create/Drop/Truncate Table
   Alter Table/Partition/Column
   Create/Drop/Alter View
   Create/Drop/Alter Index
   Create/Drop Function
   Create/Drop/Grant/Revoke Roles and Privileges
   Show
   Describe

  • 数据加载与插入语句

   Load data

1 load data [local] inpath 'filepath' [OVERWRITE] into table  tablename[PARTITION(partol1=val1,partcol2=val2...)]

   如果文件在本地,需要加[local],如果文件在hdfs上不需要添加

   filepath:表示文件路径
   overwrite:可选的,是否要覆盖数据
   tablename:表的名字

  Load data:当数据被加载至表中时,不会对数据进行任何转换,Load操作只是将数据复制/移动至Hive表对应的位置。

    默认每个表一个目录,比如数据库dbtest中,表名为tbtest,则数据存放位置为:${metastore.warehose.dir}/dbtest.db/tbtest,metastore.warehouse.dir默认值是/user/hive/warehouse

   Insert

1 insert overwrite table tablename[PARTITION(partcol1=val1,partcol2=val2...)] select_statement FROM from_statement

   从from_statement中将数据查询处理,插入到tablename表中

  • 数据模型-分区

   为减少不必要的暴力数据扫描,可以对表进行分区
   为避免产生过多小文件,建议只对离散字段进行分区(比如年龄可做分区)
   partitioned语法:

1 create table employess(
2  name string,
3  salary float,
4  subordinates array<string>,
5  deductions map<string,float>,
6  address struct<street:string,city:string,state:string,zip:int>
7  )
8  partitioned by (country string,state string);

   根据country、state进行分区

   .../employess/country=CA/state=AB
   .../employess/country=CA/state=BC
   .../employess/country=US/state=AK
   .../employess/country=US/state=AL
   最常用的是:记录日志,用每月/每天作为partition

   partition字段是存在目录名中,并不是真正的存储在数据表中
   示例:

 1 CREATE TABLE IF NOT EXISTS stcoks (
 2  ymd DATE,
 3  price_open FLOAT, 
 4  price_high FLOAT,
 5  price_low FLOAT,
 6  price_close FLOAT,
 7  volume INT,
 8  price_adj_close FLOAT
 9  )
10  PARTITIONED BY (exchanger STRING, symbol STRING)
11  ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

   创建一张stocks表,以exchanger、symbol为partition,

   导入数据:Load(导入数据之前需要将数据按照partition整理好)

1  load data local inpath '/home/zhangc/application/hivedata/stocks/NASDAQ/AAPL/stocks.csv' into table stocks partition(exchanger='NASDAQ',symbol='AAPL');

  stocks.csv表示本机需要导入表中的数据;

  exchanger='NASDAQ',symbol='AAPL'表示需要将数据导入到hive中的partition

   导入数据:insert(指定按照哪一列动态分partition)
   创建一个新的分区表record_partition,按照trancation_date进行分区
 

 1   create table if not exists record_partition(
 2  rid string,
 3  uid string,
 4  bid string,
 5  price int,
 6  source_province string,
 7  target_province string,
 8  site string,
 9  express_number string,
10  express_company string
11  )
12  partitioned by (trancation_date date);

   将原有的record表数据按照trancation_date动态进行分区,导入record_partition表中 

1  set hive.exec.dynamic.partition.mode=nonstrict;(这句很重要,否则在执行下面命令时报错)
2  insert into table record_partition partition(trancation_date) select * from record;

   partition(trancation_date):表示按照trancation_date动态进行分区

  • 外部表

   external关键字
   删除表时,外部表只删除元数据,不删除数据
   数据更加安全

   例子:
   首先将外部表用到的数据先上传到hdfs上

1 hdfs dfs -put stocks /user/zhangc

    创建外部表:

 1  create external table if not exists stocks_external(
 2  ymd date,
 3  price_open float,
 4  price_high float,
 5  price_low float,
 6  price_close float,
 7  volume int,
 8  price_adj_close float
 9  )
10  partitioned by (exchanger string,symbol string)
11  row format delimited
12  fields terminated by ','
13  location '/user/zhangc/stocks';

   添加外部表关键字:external

   location表示:外部表数据在HDFS上的存放位置
   载入数据:

1  alter table stocks_external add partition(exchanger='NASDAQ',symbol='AAPL')
2  location '/user/zhangc/stocks/NASDAQ/AAPL/'

   表示将外表stocks_external的partition与HDFS上的数据进行关联

 

  • 如何创建ORC表

  建表:

 1  create table if not exists record_ord(
 2  rid string,
 3  uid string,
 4  bid string
 5  price int,
 6  source_province string,
 7  target_province string,
 8  site string,
 9  express_number string,
10  express_company string,
11  trancation_date date
12  )
13  stored as orc;

   导入数据(从另外一个表中导入数据)

1 insert into table record_orc select * from record;