hive-1.2.2

hive-1.2.2

Hive是基于hadoop的一个数据仓库工具,可以将结构化数据文件映射为一张数据库表,并提供类SQL查询功能,

Hive本质就是将HQL转换成MapReduce程序

Hive建立在Hadoop的其他组件之上

Hive依赖HDFS进行数据存储

Hive依赖MapReduce完成查询操作

其主要用途是用来做离线数据分析,比直接用mr开发效率更高

 

数据库和数据仓库的区别:

 

Hive转mr的过程:

 

Hive的优缺点:

 

Hive安装模式:

内嵌模式:在不修改任何配置的情况下,在本机通过默认的元数据数据库管理,hive有自带的derby数据库,在首次启动hive的时候需要进行初始化数据,因为有一些默认的表结构和默认的数据库。初始化命令:bin/schematool -initSchema -dbType derby,初始化成功后会在当前执行命令的目录下生产metastore_db文件夹。在任意目录下执行${HIVE_HOME}/bin/hive命令会进入hive shell窗口,同时也会在当前目录下重新生成metastore_db,无法做到数据共享(在此之前需要启动hdfs)(derby只能单用户操作)

本地模式:改变元数据的存放位置(数据共享,多用户操作,速度还行),主要是将元数据存储到mysql中,这样可以再任意路径下执行hive命令达到数据共享:修改配置文件hive-site.xml,将连接mysql的jar加入lib目录下,可以再任意目录下执行bin/schematool -initSchema -dbType derby初始化hive生成的元数据全部写入mysql中

远程模式:hive服务和metastore在不同的进程内,可以时不同的机器

CAP原则(定理):在一个分布式系统中,一致性consistency,可用性availability,分区容错性partition,三者不可兼得

ETL:抽取extract、转换transform、装载load

BI:商业智能Business Intelligence

 

hive的架构:

 

hive的数据倾斜:

 

hive的数据类型:

基本数据类型:一般情况下只存储一个值

集合类型:可以存储多个值,常用的有三类,Array、Map、Struct、Union

 

hql分类

ddl:数据定义语言,建表,修改表,删表,分区,数据类型

dml:数据操纵语言,数据导入,数据导出

dql:数据查询语言

 

创建db:

  1. CREATE DATABASE IF NOT EXISTS db1 COMMENT 'desc' WITH DBPROPERTIES ('name'='desc'); =>对应在hdfs的存储位置/user/hive/warehouse/db1.db
  2. CREATE DATABASE IF NOT EXISTS db2 COMMENT 'desc' LOCATION '/external/hdfs/hive/db' WITH DBPROPERTIES ('name'='desc'); =>对应在hdfs的存储位置/external/hdfs/hive/db/db1.db =>对应hdfs的存储位置/external/hdfs/hive/db

创建table

  1. CREATE TEMPORARY EXTERNAL TABLE DB.TABLE_NAME(COLUMN_NAME DATA_TYPE  COMMENT 'desc',...);
  2. create EXTERNAL table t3(name string comment 'people name',likes ARRAY<string>,cards MAP<string,string>,address STRUCT<province:string,city:string>) COMMENT 'desc' LOCATION '/external/hdfs/hive/table'; =>/external/hdfs/hive/table

 

TEMPORARY:临时表,在hive中进行统计的时候经常会用到一些中间表,只存在于当前会话中

EXTERNAL:外部表,默认表为内部表|托管表|管理表,通过desc formatted 表名查看

 

在创建表时如果没有指定分隔符的话,装在数据时会将一行的内容全部给第一个字段,其他的字段都为NULL

 

将某一个数据库下的表导出到hdfs中

export table t34 to '/hdfs/t'

备份

export table t34 from '/hdfs/t'

 

hive可以安装在任意一台机器上,前提是需要该台机器有hadoop的安装包,且环境变量中配置HADOOP_HOME

配置hive环境变量

vim ~/.bash_profile

source ~/.bash_profile

export HIVE_HOME=/home/hadoop/hive/apache-hive-1.2.2-bin

${HIVE_HOME}/bin

启动hadoop

启动hive

显示所有数据库

show databases;

显示所有表

show tables;

 

创建表t_1,并使用逗号作为属性分词

create table t_1(id int,name string,add string) row format delimited fields terminated by ',';

 

查询表数据

select * from t_1;

创建表t_1就相当于在hdfs上创建一个/user/hive/warehouse/t_1文件夹,其中这种表创建方式会默认在/user/hive/warehouse/下新建表名,表t_1使用的数据库为默认default,而默认default数据库的目录是/user/hive/warehouse/

hive命令

创建数据库db_1

create database db_1;

 

显示所有数据库

show databases;

 

使用db_1数据库

use db_1;

 

创建表t_2,并使用空格作为属性分词

create table t_2(id int,price double) row format delimited fields terminated by  ;

 

显示所有表

show tables;

 

查看表详情

desc t_1;

创建表t_2就相当于在hdfs上创建一个/user/hive/warehouse/db_1.db/t_2文件夹,

其中db_1.db是因为t_2表是在数据库db_1中创建的

 

上传文件到/user/hive/warehouse/t_1目录下

hdfs dfs -put t1.data /user/hive/warehouse/t_1

使用默认数据库

use default;

 

查询表数据

select * from t_1;

 

select add,count(*) from t_1 group by add;

 

metastore_db为hive的元数据信息,其创建的路径取决于在哪里运行hive命令

 

修改配置文件hive-site.xml

<?xml version="1.0" encoding="utf-8"?>

<configuration>

        <property>

                <name>javax.jdo.option.ConnectionURL</name>       <value>jdbc:mysql://192.168.2.113: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>passwd</value>

        </property>

<property>

                <name>hive.metastore.schema.verification</name>

                <value>false</value>

        </property>

</configuration>

 

再次使用hive命令启动会报下错,原因是hive的lib目录下缺少mysql驱动包

加入mysql驱动包后再次运行hive命令

执行hive语句报错及其解决办法

报错如下:

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:For direct MetaStore DB connections, we don't support retries at the client level.)

 

在mysql数据库中执行如下sql语句:

ALTER database hive CHARACTER set latin1;

修改编码后再次创建,成功

后台服务启动hive,占用端口10000

nohup hiveserver2 & 将hive作为后台服务启动

netstat -nltp查看端口占用情况

查看hiveserver2的java进程

jps -l

客户端访问hive,beeline就是hive的客户端

beeline 使用beeline客户端连接hive

!connect jdbc:hive2://slave1:10000 连接hive,用户名root,密码空

修改hiverserver2 端口

hiverserver2 --hiveconf hive.server2.thrift.port=14000

通过脚本批量执行hive命令

vi test.sh 编写脚本

#!/bin/bash

hive -e "insert into t_1 values(5,'jj','wx');select * from t_1;"

sh test.sh 运行脚本

hive的ddl操作

建立内部表

create table t_2(id int,name string,salary bigint,add string) row format delimited fields terminated by ',';

建立外部表

create external table t_3(id int,name string,salary bigint,add string) row format delimited fields terminated by ',' location '/aa/bb';

 区别:内部表的目录由hive创建在默认的仓库目录下,/user/hive/warehouse/

   外部表的目录由用户建表时通过location指定

   drop一个内部表时,表的元信息和表数据目录都会被删除

   drop一个外部表时,只删除表的元信息,而表数据目录不会被删除

意义:通常一个数据仓库系统,数据总有一个源头,而源头一般是别的应用系统产生的,其目录无定法,为了方便映射,就可以在hive中用外部表进行映射,并且,就算在hive中把这个表给drop掉,也不会删除hdfs数据目录,也不会影响到别的应用系统

如果所有处理都有hive来完成建议使用 managed table

如果要用hive和其他工具来处理同一个数据集,应该使用external table

 

多重插入

fromt t_4

insert overwrite table t_1 partition(day='1')

select ip,url,staylong where staylong < 200

insert overwrite table t_2 partition(day='2')

select ip,url,staylong where staylong > 200;

 

导入数据

将hive运行所在机器的本地磁盘文件导入表中

load data local inpath '/root/user.data.1' into/overwrite table t_1;

local inpath是hive运行的那台机器上的路径

into/overwrite 追加/覆盖

 

将hdfs中的文件剪切到表中

load data inpath '/root/user.data.1' into table t_1;

 

从别的表中查询后得到的数据插入到一张新建表

create table t_1_jz as select * from t_1;

 

从别的表中查询后得到的数据插入到一张已存在的表

insert into table t_1_hb select id,name,add from t_1 where add = 'wh';

 

导出数据

将数据从hive的表中导出到hdfs的目录中

insert overwrite directory '/aa/bb' select * from t_1 where add = 'wh';

 

将数据从hive的表中导出到本地磁盘中

insert overwrite local directory '/aa/bb' select * from t_1 where add = 'wh';

hive的存储文件格式

SEQUENCE FILE | TEXT FILE | PARQUET FILE | RC FILE

 

create table t_seq(id int,name string,add string) stored as sequencefile;

分区

创建分区表

create table t_part(id int,name string) partitioned by (day string) row format delimited fields terminated ',';

 

显示表的所有分区

show partitions t_part;

 

插入一条数据

insert into table t_part partition(day='2013-14-520') values(1,'dmq');

 

给表增加分区,原表必须是分区表

alter table t_part add partition(day='2017-04-10') partition(day='2017-04-11');

 

往分区中导入数据

load local inpath '/root/data' into table t_part partition(day='2017-04-11');

 

insert into table t_part parition(day='2017-04-11') select id,name from t_4 where staylong > 30;

 

删除分区

alter table t_part drop partition(day='2017-04-11');

分桶

比分区还要细的一个数据分类

基于表的

create table ttt(name string,age int) clustered by(name) into 20 buckets;

基于分区的

create table tttt(name string,age int) partitioned by (sex int) clustered by(name) into 10 buckets;

 

修改表

修改表名

alter table t_part rename to t_pp;

 

增加表字段

alter table t_part add columns (sex string,date string);

 

完全替换表字段

alter table t_part replace columns (sex string,date string);

 

修改字段

alter table t_part change sex xingbie string;

 

显示命令

show databases;

show tables;

show partitions t_part;

show functions;

desc t_part;

desc extended t_part;

desc formatted t_part;

 

复杂数据解析

 

hive之java API操作

private String driverName = "org.apache.hive.jdbc.HiveDriver";

private  String url = "jdbc:hive2://192.168.218.135:10000/db1";

private String username = "root";

private String password = "";

private Connection connection;

private Statement statement;

猜你喜欢

转载自blog.csdn.net/qq_33436466/article/details/83628264