个人笔记之Hive

26 篇文章 0 订阅
25 篇文章 0 订阅

个人笔记之Hive

1.Hive的基本概念

Hive是为了让开发人员更简单地操作MapReduce而开发出来的。

关于Hive的难点不多,可以把它理解为一个翻译器,将SQL语句自动翻译成MapReduce的相应代码然后用来处理大量的数据。优点是节省了写MapReduce代码的时间和功夫,换句话说以前必须要对MapReduce有足够了解而且对业务和数据等的分析能力足够强才能熟练使用MapReduce,但是现在只要熟练使用SQL语句就可以使用MapReduce,降低了部分使用门槛。缺点也很明显,在处理小批量数据的时候速度就相对较慢了,特定业务场景下反而会存在延时。而且由于技术原因,部分比较复杂的功能还是只能手动实现。

学习hive的时候如果对SQL语句比较熟悉的话就会学的比较舒服了。

2.Hive的安装与调试

(为节省时间直接copy了)

前置:MySQL,HadoopHA,MapReduce和Yarn均安装完毕。

Hive的安装

节点\功能metastorehiveserver2client
node01**
node02*
node03*

PS: 安装前 请确认当前集群已经安装了Mysql数据库和Hadoop的Ha+Yarn

下载上传解压

  • 下载地址

    • http://archive.apache.org/dist/hive/

    • [root@node01 ~]# tar -zxvf apache-hive-3.1.2-bin.tar.gz 
      [root@node01 ~]# 
      [root@node01 ~]# cd /opt/lzj/apache-hive-3.1.2-bin/conf
      

修改配置文件

  • 配置hive-env.sh

    • [root@node01 conf]# cp hive-env.sh.template hive-env.sh

    • [root@node01 conf]# vim hive-env.sh

    • HADOOP_HOME=/opt/lzj/hadoop-3.1.2/
      export HIVE_CONF_DIR=/opt/lzj/apache-hive-3.1.2-bin/conf 
      export HIVE_AUX_JARS_PATH=/opt/lzj/apache-hive-3.1.2-bin/lib
      
  • 创建hive-site.xml

    • [root@node01 conf]# cp hive-default.xml.template hive-site.xml

    • [root@node01 conf]# vim hive-site.xml

    • 删除多余的配置文件 6897dd

    • <!-- 数据库相关配置 -->
      <property>
          <name>javax.jdo.option.ConnectionURL</name>
          <value>jdbc:mysql://node01:3306/hive?createDatabaseIfNotExist=true</value>
      </property>
      <property>
          <name>javax.jdo.option.ConnectionDriverName</name>
          <value>com.mysql.jdbc.Driver</value>
      </property>
      <property>
          <name>javax.jdo.option.ConnectionUserName</name>
          <value>root</value>
      </property>
      <property>
          <name>javax.jdo.option.ConnectionPassword</name>
          <value>123456</value>
      </property>
      <property>
          <name>datanucleus.schema.autoCreateAll</name>
          <value>true</value>
      </property>
      <property>
          <name>hive.metastore.schema.verification</name>
          <value>false</value>
      </property>
      <!-- 美化打印数据 -->
      <property>
          <name>hive.cli.print.header</name>
          <value>true</value>
      </property>
      <property>
          <name>hive.cli.print.current.db</name>
          <value>true</value>
      </property>
      
      <!-- hive server -->
      <property>
          <name>hive.server2.webui.host</name>
          <value>node01</value>
      </property>
      <property>
          <name>hive.server2.webui.port</name>
          <value>10002</value>
      </property>
      
      <!-- 数据存储位置 -->
      <property>
          <name>hive.metastore.warehouse.dir</name>
          <value>/hive/warehouse</value>
      </property>
      
      
  • 修改core-site.xml

    • [root@node01 conf]# vim /opt/lzj/hadoop-3.1.2/etc/hadoop/core-site.xml

    • 后面添加配置信息

    • <!--该参数表示可以通过httpfs接口hdfs的ip地址限制-->
      <property>
          <name>hadoop.proxyuser.root.hosts</name>
          <value>*</value>
      </property>
      <!--通过httpfs接口访问的用户获得的群组身份-->
      <property>
          <name>hadoop.proxyuser.root.groups</name>
          <value>*</value>
      </property>
      

配置日志组件

  • 创建文件目录

    • [root@node01 ~]# mkdir -p /opt/lzj/apache-hive-3.1.2-bin/logs

    • [root@node01 conf]# cp hive-log4j2.properties.template hive-log4j2.properties

    • [root@node01 conf]# vim hive-log4j2.properties

    • property.hive.log.dir = /opt/lzj/apache-hive-3.1.2-bin/logs
      

添加驱动包

  • Mysql驱动添加到hive的lib目录下

  • [root@node01 ~]# cp ~/mysql-connector-java-5.1.32-bin.jar /opt/lzj/apache-hive-3.1.2-bin/lib/

  • Guava包

    • 首先要删除hadoop中的guava-*.jar包

    • [root@node01 ~]# rm -rf /opt/lzj/hadoop-3.1.2/share/hadoop/common/lib/guava-*.jar
      [root@node01 ~]# rm -rf /opt/lzj/hadoop-3.1.2/share/hadoop/hdfs/lib/guava-*.jar
      
    • 将Hive的Guava拷贝给Hive

    • [root@node01 ~]# cp /opt/lzj/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/lzj/hadoop-3.1.2/share/hadoop/common/lib/
      [root@node01 ~]# cp /opt/lzj/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/lzj/hadoop-3.1.2/share/hadoop/hdfs/lib/
      

配置环境变量

  • vim /etc/profile

    • export HIVE_HOME=/opt/lzj/apache-hive-3.1.2-bin
      export PATH=$HIVE_HOME/bin:$PATH
      
  • source /etc/profile

拷贝到其他节点

  • hive文件夹

    • [root@node02 ~]# scp -r root@node01:/opt/lzj/apache-hive-3.1.2-bin /opt/lzj/
      [root@node03 ~]# scp -r root@node01:/opt/lzj/apache-hive-3.1.2-bin /opt/lzj/
      
  • 环境变量

    • [root@node01 ~]# scp /etc/profile root@node02:/etc/profile
      [root@node01 ~]# scp /etc/profile root@node03:/etc/profile
      
    • 【123】source /etc/profile

  • core-stie.xml

    • [root@node01 ~]# scp /opt/lzj/hadoop-3.1.2/etc/hadoop/core-site.xml root@node02:/opt/lzj/hadoop-3.1.2/etc/hadoop/
      [root@node01 ~]# scp /opt/lzj/hadoop-3.1.2/etc/hadoop/core-site.xml root@node03:/opt/lzj/hadoop-3.1.2/etc/hadoop/
      
  • jar包

    • [root@node02 ~]# rm -rf /opt/lzj/hadoop-3.1.2/share/hadoop/common/lib/guava-*.jar
      [root@node02 ~]# rm -rf /opt/lzj/hadoop-3.1.2/share/hadoop/hdfs/lib/guava-*.jar
      [root@node03 ~]# rm -rf /opt/lzj/hadoop-3.1.2/share/hadoop/common/lib/guava-*.jar
      [root@node03 ~]# rm -rf /opt/lzj/hadoop-3.1.2/share/hadoop/hdfs/lib/guava-*.jar
      
      [root@node02 ~]# cp /opt/lzj/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/lzj/hadoop-3.1.2/share/hadoop/common/lib/
      [root@node02 ~]# cp /opt/lzj/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/lzj/hadoop-3.1.2/share/hadoop/hdfs/lib/
      
      [root@node03 ~]# cp /opt/lzj/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/lzj/hadoop-3.1.2/share/hadoop/common/lib/
      [root@node03 ~]# cp /opt/lzj/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/lzj/hadoop-3.1.2/share/hadoop/hdfs/lib/
      

客户端配置文件

  • 选取node03为客户端节点

    • [23] vim /opt/lzj/apache-hive-3.1.2-bin/conf/hive-site.xml

    • <property>
          <name>hive.metastore.warehouse.dir</name>
          <value>/hive/warehouse</value>
      </property>
      <property>
          <name>hive.cli.print.header</name>
          <value>true</value>
      </property>
      <property>
          <name>hive.cli.print.current.db</name>
          <value>true</value>
      </property>
      <property>
          <name>hive.metastore.schema.verification</name>
          <value>false</value>
      </property>
      <property>
          <name>datanucleus.schema.autoCreateAll</name>
          <value>true</value>
      </property>
      <!--指定hive.metastore.uris的port.为了启动metastore服务的时候不用指定端口-->
      <!--hive ==service metastore -p 9083 & | hive ==service metastore-->
      <property>
          <name>hive.metastore.uris</name>
          <value>thrift://node01:9083</value>
      </property>
      

启动集群

  • 启动Zookeeper

    • 【123】zkServer.sh start
  • 启动Hdfs+Yarn

    • [root@node01 ~]# start-all.sh
  • 初始化数据库

    • [root@node01 ~]# schematool -dbType mysql -initSchema
  • (这部分启动方式有点混乱,所以我自己用下面总结的方式启动)
    - 启动Hive
      - [root@node01 ~]# hive --service metastore
      - [root@node01 ~]# nohup  hive --service metastore  >>/dev/null 2 >& 1 &
      - [root@node03 ~]# hive
    - 启动HiveServer2
      - [root@node01 ~]# hiveserver2
      - [root@node03 ~]# beeline -u jdbc:hive2://node01:10000 -n root
    

RE:启动HIVE集群的正确连续操作

[(once)root@node01 ~]# hadoop fs -chmod -R 777 /lzj
//第一次启动完以后就直接这一步就可以了
[root@node01 ~]# nohup  hive --service metastore  >>/dev/null 2>&1 &
[root@node01 ~]# nohup hiveserver2 > /dev/null 2>&1 &
[root@node03 ~]# beeline -u jdbc:hive2://node01:10000 -n root

Hive的三种交互方式

1)第一种交互方式

shell交互Hive,用命令hive启动一个hive的shell命令行,在命令行中输入sql或者命令来和Hive交互。

服务端启动metastore服务:nohup hive --service metastore > /dev/null 2>&1 &
进入命令:hive
退出命令行:quit;

!!! 2)第二种交互方式

Hive启动为一个服务器,对外提供服务,其他机器可以通过客户端通过协议连接到服务器,来完成访问操作,这是生产环境用法最多

hadoop fs -chmod -R 777 /lzj

服务端启动hiveserver2服务:nohup hiveserver2 > /dev/null 2>&1 &

需要稍等一下,启动服务需要时间:

进入命令:1)先执行beeline,在执行! connect jdbc:hive2://node01:10000 
        2)或者直接执行 beeline -u jdbc:hive2://node01:10000 -n root
退出命令行:!exit

3)第三种交互方式

  • 使用 –e 参数来直接执行hql的语句
bin/hive -e "show databases;"
  • 使用 –f 参数通过指定文本文件来执行hql的语句
vim hive.sql
use myhive;
select * from test;

保存退出

hive -f hive.sql

特点:执行完sql后,回到linux命令行。

4)在hive cli和beeline cli的区别
在这里插入图片描述

  • metastore服务实际上就是一种thrift服务,通过它我们可以获取到hive元数据,并且通过thrift获取原数据的方式,屏蔽了数据库访问需要驱动,url,用户名,密码等等细节。
    HiveServer2(HS2)是一个服务端接口,使远程客户端可以执行对Hive的查询并返回结果。一般来讲,我们认为HiveServer2是用来提交查询的,也就是用来访问数据的。 而MetaStore才是用来访问元数据的。
  • beeline cli优化了命令行界面

3.Hive深入之元数据

(copy的,这部分是描述Hive中对于表信息的描述)

Hive元数据

Hive元数据库中一些重要的表结构及用途,方便Impala、SparkSQL、Hive等组件访问元数据库的理解。

元数据一般存储在mysql数据库中也就是放在MetaStore上。

1、存储Hive版本的元数据表(VERSION)

该表比较简单,但很重要。

VER_IDSCHEMA_VERSIONVERSION_COMMENT
ID主键Hive版本版本说明
11.1.0Set by MetaStore

如果该表出现问题,根本进入不了Hive-Cli。比如该表不存在,当启动Hive-Cli时候,就会报错”Table ‘hive.version’ doesn’t exist”。

2、Hive数据库相关的元数据表(DBS、DATABASE_PARAMS)

DBS:该表存储Hive中所有数据库的基本信息,字段如下:

表字段说明示例数据
DB_ID数据库ID1
DESC数据库描述Default Hive database
DB_LOCATION_URI数据HDFS路径hdfs://193.168.1.75:9000/test-warehouse
NAME数据库名default
OWNER_NAME数据库所有者用户名public
OWNER_TYPE所有者角色ROLE

DATABASE_PARAMS:该表存储数据库的相关参数,在CREATE DATABASE时候用WITH DBPROPERTIES(property_name=property_value, …)指定的参数。

表字段说明示例数据
DB_ID数据库ID1
PARAM_KEY参数名createdby
PARAM_VALUE参数值root

DBS和DATABASE_PARAMS这两张表通过DB_ID字段关联。

3、Hive表和视图相关的元数据表

主要有TBLS、TABLE_PARAMS、TBL_PRIVS,这三张表通过TBL_ID关联。

TBLS:该表中存储Hive表,视图,索引表的基本信息

表字段说明示例数据
TBL_ID表ID21
CREATE_TIME创建时间1447675704
DB_ID数据库ID1
LAST_ACCESS_TIME上次访问时间1447675704
OWNER所有者root
RETENTION保留字段0
SD_ID序列化配置信息41,对应SDS表中的SD_ID
TBL_NAME表名ex_detail_ufdr_30streaming
TBL_TYPE表类型EXTERNAL_TABLE
VIEW_EXPANDED_TEXT视图的详细HQL语句
VIEW_ORIGINAL_TEXT视图的原始HQL语句

TABLE_PARAMS:该表存储表/视图的属性信息

表字段说明示例数据
TBL_ID表ID1
PARAM_KEY属性名totalSize,numRows,EXTERNAL
PARAM_VALUE属性值970107336、21231028、TRUE

TBL_PRIVS:该表存储表/视图的授权信息

表字段说明示例数据
TBL_GRANT_ID授权ID1
CREATE_TIME授权时间1436320455
GRANT_OPTION0
GRANTOR授权执行用户root
GRANTOR_TYPE授权者类型USER
PRINCIPAL_NAME被授权用户username
PRINCIPAL_TYPE被授权用户类型USER
TBL_PRIV权限Select、Alter
TBL_ID表ID21,对应TBLS表的TBL_ID

4、Hive文件存储信息相关的元数据表

主要涉及SDS、SD_PARAMS、SERDES、SERDE_PARAMS,由于HDFS支持的文件格式很多,而建Hive表时候也可以指定各种文件格式,Hive在将HQL解析成MapReduce时候,需要知道去哪里,使用哪种格式去读写HDFS文件,而这些信息就保存在这几张表中。

SDS:

该表保存文件存储的基本信息,如INPUT_FORMAT、OUTPUT_FORMAT、是否压缩等。TBLS表中的SD_ID与该表关联,可以获取Hive表的存储信息。

表字段说明示例数据
SD_ID存储信息ID41
CD_ID字段信息ID21,对应CDS表
INPUT_FORMAT文件输入格式org.apache.hadoop.mapred.TextInputFormat
IS_COMPRESSED是否压缩0
IS_STOREDASSUBDIRECTORIES是否以子目录存储0
LOCATIONHDFS路径hdfs://193.168.1.75:9000/detail
_ufdr_streaming_test
NUM_BUCKETS分桶数量0
OUTPUT_FORMAT文件输出格式org.apache.hadoop.hive.ql.io.H
iveIgnoreKeyTextOutputFormat
SERDE_ID序列化类ID41,对应SERDES表

SD_PARAMS: 该表存储Hive存储的属性信息,在创建表时候使用STORED BY ‘storage.handler.class.name’ [WITH SERDEPROPERTIES (…)指定。

表字段说明示例数据
SD_ID存储配置ID41
PARAM_KEY存储属性名
PARAM_VALUE存储属性值

SERDES:该表存储序列化使用的类信息

表字段说明示例数据
SERDE_ID序列化类配置ID41
NAME序列化类别名NULL
SLIB序列化类org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

SERDE_PARAMS:该表存储序列化的一些属性、格式信息,比如:行、列分隔符

表字段说明示例数据
SERDE_ID序列化类配置ID41
PARAM_KEY属性名field.delim
PARAM_VALUE属性值|

5、Hive表字段相关的元数据表

主要涉及COLUMNS_V2

COLUMNS_V2:该表存储表对应的字段信息

表字段说明示例数据
CD_ID字段信息ID21
COMMENT字段注释NULL
COLUMN_NAME字段名air_port_duration
TYPE_NAME字段类型bigint
INTEGER_IDX字段顺序119

6、Hive表分分区相关的元数据表

主要涉及PARTITIONS、PARTITION_KEYS、PARTITION_KEY_VALS、PARTITION_PARAMS

PARTITIONS:该表存储表分区的基本信息

表字段说明示例数据
PART_ID分区ID21
CREATE_TIME分区创建时间1450861405
LAST_ACCESS_TIME最后一次访问时间0
PART_NAME分区名hour=15/last_msisdn=0
SD_ID分区存储ID43
TBL_ID表ID22
LINK_TARGET_IDNULL

PARTITION_KEYS:该表存储分区的字段信息

表字段说明示例数据
TBL_ID表ID22
PKEY_COMMENT分区字段说明NULL
PKEY_NAME分区字段名hour
PKEY_TYPE分区字段类型int
INTEGER_IDX分区字段顺序0

PARTITION_KEY_VALS:该表存储分区字段值

表字段说明示例数据
PART_ID分区ID21
PART_KEY_VAL分区字段值0
INTEGER_IDX分区字段值顺序1

PARTITION_PARAMS:该表存储分区的属性信息

表字段说明示例数据
PART_ID分区ID21
PARAM_KEY分区属性名numFiles,numRows
PARAM_VALUE分区属性值1,502195

6、其他不常用的元数据表

DB_PRIVS:数据库权限信息表。通过GRANT语句对数据库授权后,将会在这里存储。

IDXS:索引表,存储Hive索引相关的元数据

INDEX_PARAMS:索引相关的属性信息

TBL_COL_STATS:表字段的统计信息。使用ANALYZE语句对表字段分析后记录在这里

TBL_COL_PRIVS:表字段的授权信息

PART_PRIVS:分区的授权信息

PART_COL_PRIVS:分区字段的权限信息

PART_COL_STATS:分区字段的统计信息

FUNCS:用户注册的函数信息

FUNC_RU:用户注册函数的资源信息

4.Hive深入之表

Hive对数据库的操作 几 乎 和SQL语句 一 毛 一 样

特别是对库的操作,SQL怎么查看hive就怎么查看。

例:

//显示出所有的数据库
show databases;
//如果数据库student不存在,则创建它
create database if not exists student;
//进去student库
use student;
//查看当前库中所有的表
show tables;

但是它的字段属性和SQL有一些区别。

下面是一些基础语法和概念,

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name   
  [(col_name data_type [column_specification] [COMMENT col_comment], ...   [constraint_specification])]
  [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]
  [SKEWED BY (col_name, col_name, ...)      
     ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
     [STORED AS DIRECTORIES]
  [
   [ROW FORMAT row_format] 
   [STORED AS file_format]
     | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]  
  ]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (property_name=property_value, ...)]  
  [AS select_statement];   
 
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
  LIKE existing_table_or_view_name
  [LOCATION hdfs_path];
 
data_type
  : primitive_type
  | array_type
  | map_type
  | struct_type
  | union_type 

//字段类型,基本与JAVA的基本数据对应
primitive_type
  : TINYINT
  | SMALLINT
  | INT
  | BIGINT
  | BOOLEAN
  | FLOAT
  | DOUBLE
  | DOUBLE PRECISION 
  | STRING
  | BINARY     
  | TIMESTAMP  
  | DECIMAL    
  | DECIMAL(precision, scale)  
  | DATE        
  | VARCHAR   
  | CHAR       
 
array_type
  : ARRAY < data_type >
 
map_type
  : MAP < primitive_type, data_type >
 
struct_type
  : STRUCT < col_name : data_type [COMMENT col_comment], ...>
 
union_type
   : UNIONTYPE < data_type, data_type, ... >  
 
row_format
  : DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
        [NULL DEFINED AS char]  
  | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
 
file_format:
  : SEQUENCEFILE
  | TEXTFILE    -- (Default, depending on hive.default.fileformat configuration)
  | RCFILE      -- (Note: Available in Hive 0.6.0 and later)
  | ORC         -- (Note: Available in Hive 0.11.0 and later)
  | PARQUET     -- (Note: Available in Hive 0.13.0 and later)
  | AVRO        -- (Note: Available in Hive 0.14.0 and later)
  | JSONFILE    -- (Note: Available in Hive 4.0.0 and later)
  | INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname
 
column_constraint_specification:
  : [ PRIMARY KEY|UNIQUE|NOT NULL|DEFAULT [default_value]|CHECK  [check_expression] ENABLE|DISABLE NOVALIDATE RELY/NORELY ]
 
default_value:
  : [ LITERAL|CURRENT_USER()|CURRENT_DATE()|CURRENT_TIMESTAMP()|NULL ] 
 
constraint_specification:
  : [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ]
    [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ]
    [, CONSTRAINT constraint_name FOREIGN KEY (col_name, ...) REFERENCES table_name(col_name, ...) DISABLE NOVALIDATE 
    [, CONSTRAINT constraint_name UNIQUE (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ]
    [, CONSTRAINT constraint_name CHECK [check_expression] ENABLE|DISABLE NOVALIDATE RELY/NORELY ]
create table t_weather(
id int,
province string,
city string,
adcode int,
weather string,
temperature int,
winddirection string,
windpower string,
humidity int,
reporttime date,
createtime date
) 
row format delimited fields terminated by ',' 
lines terminated by '\n';

内部表外部表

概念:Hive上创建的表并非在数据库创建了一张表,而是创建了一张概念上的表。
其建表的元数据保存在数据库中作为参考,而表中的数据则存在文件中。
关键字段:EXTERNAL(不加就是内部表,加上则声明为外部表)

内部表:

当创建内部表的时候,HDFS会在表所属的库空间中创建一个文件夹,当load文件后,文件中的内容就不能再修改,一旦删除表,会将对应的文件以及文件夹一起删除。

CREATE TABLE IF NOT EXISTS user (
  UID int,
  UNAME varchar(255),
  AGE int,
  CREATEDATE date
) 
row format delimited fields terminated by '\t'
外部表:

当创建外部表的时候,需要加上EXTERNAL字段来声明当前的表是外部表。创建外部表使用的文件是在HDFS上指定而来的,hive不会独占该数据,当表删除时,数据仍然会存在。但是外部表创建的时候并不会自动创建文件夹,所以需要在创建表的同事指定表存放的路径。

CREATE EXTERNAL TABLE IF NOT EXISTS user (
  UID int,
  UNAME varchar(255),
  AGE int,
  CREATEDATE date
) 
row format delimited fields terminated by '\t'
location '/cl/user'

分区表

当hive表中的数据量较大时,为了方便快速查找以及减少查询压力,我们会根据指定字段属性来对表进行分区。
假设一个用户user表中有一亿条数据,现在我需要查看上个月的所有用户信息。如果是在一亿条数据中进行查询速度也会很慢,所以我们可以对表进行分区处理,假定该数据的跨度是十年,那我们就将分区设为年,这样的话表中的数据就被分为了十份,而本次业务所需的所有的数据就可以在今年的分区里查看。
分区的好处是很明显的,能大大提高我们业务处理的效率,减少查询所用的时间。

而分区中又有两个概念:
静态分区和动态分区的区别在于数据插入的时候。
静态分区:
开发者手动指定分区的字段和值。

CREATE TABLE IF NOT EXISTS user (
  UID int,
  UNAME varchar(255),
  AGE int,
  CREATEDATE date
) partitioned by(grade int)
--分区的字段名不能和表的字段名一样,会报错。
row format delimited fields terminated by '\t'--载入数据,此时指定分区的值
load data inpath '/lzj/student.txt' into table t_student partition(grade=1);

动态分区:
开发者指定分区的字段,值由系统自动判断决定。
首先要在Hive配置文件中配置如下选项开启分区:

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

分桶表

接分区的说法:
在分区中其实存在着一个比较致命的问题:数据倾斜。
比如说,这一亿条数据有9000万条都是去年的,这样的话分区就比较尴尬了,并没有起到预期的作用。
所以在此基础上又有了分桶的概念。比如:用户的ID都是唯一的,所以如果让这一亿条用户数据用ID对10取模,这样就能把淑芬分为相对均匀的十份,这样的话真正能起到简化查询的目的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值