hive3.1.2安装

 

备注:在安装Hive3.1.2之前,请首先安装Hadoop3.1.3。

一、安装Hive3.1.2

1. 下载并解压Hive安装包

tar -zxvf ./apache-hive-3.1.2-bin.tar.gz -C /usr/local    

cd /usr/local/

mv apache-hive-3.1.2-bin hive                               

chown -R hadoop:hadoop hive                           

 

2. 配置环境变量

vim /etc/profile

export HADOOP_HOME=/usr/local/hadoop

export HIVE_HOME=/usr/local/hive

export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin:$HADOOP_HOME/bin

 

source /etc/profile

 

3. 修改hive-env.xml

cd /usr/local/hive/conf

cp hive-env.sh.template hive-env.sh   

vim hive-env.sh

export JAVA_HOME=/usr/local/jdk1.8.0_271

export HADOOP_HOME=/home/Hadoop

export HIVE_CONF_DIR=/home/hive/conf

 

3. 修改hive-site.xml

cd /usr/local/hive/conf

mv hive-default.xml.template hive-site.xml

vim hive-site.xml

<configuration>

<property>

        <name>system:java.io.tmpdir</name>

        <value>/user/hive/warehouse</value>

      </property>

      <property>

        <name>system:user.name</name>

        <value>${user.name}</value>

      </property>

     <property>

        <name>hive.metastore.db.type</name>

        <value>mysql</value>

     </property>

  <property>

    <name>javax.jdo.option.ConnectionURL</name>

    <value>jdbc:mysql://cancer01: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>root</value>

  </property>

<property>
 <name>datanucleus.schema.autoCreateAll</name>
 <value>true</value>
</property>
<property>
 <name>hive.metastore.schema.verification</name>
 <value>false</value>
</property>

 

<!--以下配置为配合flume sink写入hive -->

<property>

       <name>hive.metastore.uris</name>

       <value>thrift://cancer01:9083</value>

</property>

<property>

       <name>hive.txn.manager</name>

       <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>

</property>

<property>

       <name>hive.compactor.initiator.on</name>

       <value>true</value>

</property>

<property>

       <name>hive.compactor.worker.threads</name>

       <value>1</value>

</property>

<property>

       <name>hive.support.concurrency</name>

       <value>true</value>

</property>

<property>

       <name>hive.enforce.bucketing</name>

       <value>true</value>

</property>

<property>

       <name>hive.exec.dynamic.partition.mode</name>

       <value>nonstrict</value>

</property>

<property>

       <name>hive.in.test</name>

       <value>true</value>

</property>

</configuration>

 

配置说明:

(1)报错:Caused by: org.apache.thrift.TApplicationException: Internal error processing open_txns

hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; -》 打开一部分事务支持

hive.compactor.initiator.on=true; -》运行启动程序和清除线程,用于打开所需参数的完整列表事务

hive.compactor.worker.threads=1; -》增加工作线程的数量将减少花费的时间

hive.support.concurrency=true; -》是否支持并发,默认是false

hive.enforce.bucketing=true; -》是否启用bucketing,写入table数据时会启动分桶

hive.exec.dynamic.partition.mode=nonstrict; -》设置非严格模式

(2)启动metastore时报错:

Table 'metastore.COMPACTION_QUEUE' doesn't exist

配置以下属性:这个是用来创建COMPACTION_QUEUE这张表的

(3)再启动metastore时报错:

Error rolling back: Can't call rollback when autocommit=true

去掉以下属性:之前没有安装,先安装:yum install -y nc

 

3. 修改hdfs目录

$HADOOP_HOME/bin/hadoop fs -mkdir -p /tmp

$HADOOP_HOME/bin/hadoop fs -chmod g+w   /tmp

$HADOOP_HOME/bin/hadoop fs -mkdir -p /user/hive/warehouse

$HADOOP_HOME/bin/hadoop fs -chmod g+w   /user/hive/warehouse

 

4. 配置日志

配置日志,复制一个模板

cp hive-log4j2.properties.template hive-log4j2.properties

vim hive-log4j2.properties

配置property.hive.log.dir

property.hive.log.dir = /usr/local/hive/logs

 

cd /usr/local/hive/

mkdir logs

 

二、安装mysql

1. mysql安装

sudo apt-get install mysql-server

sudo apt-get install libmysql-java

 

或者

删除原有mysql

rpm -qa | grep mysql 或 yum list installed | grep mysql

yum -y remove mysql-libs.x86_64

删除原有mariadb

rpm -qa | grep -i mariadb

rpm -ev  --nodeps mariadb-libs-5.5.65-1.el7.x86_64

yum install libaio

tar -xvf mysql-5.7.31-1.el7.x86_64.rpm-bundle.tar

rpm -ivh 顺序 common-》lib-》client-》server

 

2. mysql配置

安装完,启动服务

systemctl start mysqld

systemctl status mysqld

grep "password" /var/log/mysqld.log

A temporary password is generated for root@localhost: hilX0U!9i3_6

mysql -u root -p hilX0U!9i3_6

use mysql;

grant all privileges on *.* to root@"localhost" identified by "root";

flush privileges;

 

3. 创建Hive元数据库

mysql> create database hive

use hive;

mysql> source $HIVE_HOME/scripts/metastore/upgrade/mysql/hive-schema-3.1.2.mysql.sql;

 

4. 配置mysql 驱动包

tar -zxvf mysql-connector-java-5.1.48.tar.gz

#将mysql驱动包拷贝到/usr/local/hive/lib下

cp mysql-connector-java-5.1.48-bin.jar   /usr/local/hive/lib

 

或者

ln -s /usr/share/java/mysql-connector-java.jar $HIVE_HOME/lib/mysql-connector-java.jar

三、启动hive

1. 启动

初始化hive数据库

cd /usr/local/hive/bin

schematool -dbType mysql -initSchema

 

开启metastore(&表示后台进程)

./hive --service metastore &

 

启动hadoop集群。

start-dfs.sh

#启动hive

hive

 

2. 验证

       创建库表

       create database test;

use test;

create table user(

user_id int,

user_name string,

user_age int

)CLUSTERED BY (user_id) INTO 2 BUCKETS

row format delimited fields terminated by '\t'

stored as orc;

#创建表

    hive (default)> CREATE TABLE IF NOT EXISTS test_table

                 (col1 int COMMENT 'Integer Column',

                     col2 string COMMENT 'String Column'

                 )

                 COMMENT 'This is test table'

                 ROW FORMAT DELIMITED

                 FIELDS TERMINATED BY ','

                 STORED AS TEXTFILE;

    hive (default)> show tables;

        tab_name

        test_table

    #写入

    hive (default)> insert into test_table values(1,'aaa');

        MapReduce Jobs Launched:

        Stage-Stage-1: Map: 1  Reduce: 1   Cumulative CPU: 5.54 sec   HDFS Read: 15408 HDFS Write: 243 SUCCESS

        Total MapReduce CPU Time Spent: 5 seconds 540 msec

        OK

        col1 col2

        Time taken: 26.271 seconds

    #查询

    hive (default)> select * from test_table;

        test_table.col1       test_table.col2

            2     bbb

            3     ccc

            4     ddd

        Time taken: 0.205 seconds, Fetched: 3 row(s)

jps

    root@had001:/home/hive# jps

        6675 SecondaryNameNode

        6426 NameNode

        6908 ResourceManager

        8382 Jps

jps

    root@had002:~# jps

        3300 DataNode

        3430 NodeManager

        5610 Jps

    #查看是否能连接had001

    root@had002:~# /home/hadoop/bin/hdfs dfsadmin -report

    root@had003:~# /home/hadoop/bin/hdfs dfsadmin -report

    #正常有data目录

    root@had002:~# tree /usr/local/hadoop/tmp

    /usr/local/hadoop/tmp

    ├── dfs

    │   └── data

    │       ├── current

    │       │   ├── BP-1834162669-172.17.252.52-1532682436448

    │       │   │   ├── current

    │       │   │   │   ├── finalized

四、常用HiveQL

建议参考:https://blog.csdn.net/qq_41837900/article/details/90578798

1)Hive基本数据类型

Hive支持基本数据类型和复杂类型, 基本数据类型主要有数值类型(INT、FLOAT、DOUBLE ) 、布尔型和字符串, 复杂类型有三种:ARRAY、MAP 和 STRUCT。

a.基本数据类型

TINYINT: 1个字节

SMALLINT: 2个字节

INT: 4个字节

BIGINT: 8个字节

BOOLEAN: TRUE/FALSE

FLOAT: 4个字节,单精度浮点型

DOUBLE: 8个字节,双精度浮点型STRING 字符串

b.复杂数据类型

ARRAY: 有序字段

MAP: 无序字段

STRUCT: 一组命名的字段

2)常用的HiveQL操作命令

Hive常用的HiveQL操作命令主要包括:数据定义、数据操作。7807190917

  1. 常用命令

hive -help

 

“-e”不进入hive的交互窗口执行sql语句

   # hive -e "select id from student;"

 

“-f”执行脚本中sql语句

在/opt/module/datas目录下创建hivef.sql文件

# touch hivef.sql

select *from student;

执行文件中的sql语句

# bin/hive -f /opt/module/datas/hivef.sql

执行文件中的sql语句并将结果写入文件中

#bin/hive -f /opt/module/datas/hivef.sql  > /opt/module/datas/hive_result.txt

 

退出hive

hive(default)>exit;

hive(default)>quit;

 

在hive cli命令窗口中如何查看hdfs文件系统

hive(default)>dfs -ls /;

 

在hive cli命令窗口中如何查看本地文件系统

hive(default)>! ls /opt/module/datas;

  1. 数据定义

主要用于创建修改和删除数据库、表、视图、函数和索引.

创建、修改和删除数据库

create database if not exists hive;                      #创建数据库

show databases;                                #查看Hive中包含数据库

show databases like 'h.*';                            #查看Hive中以h开头数据库

describe databases;                               #查看hive数据库位置等信息

desc database ;                                                      #显示数据库信息

desc database extended ;                                       #显示数据库详细信息

alter database hive set dbproperties;                   #为hive设置键值对属性

use hive;                                       #切换到hive数据库下

drop database if exists hive;                   #删除不含表的数据库

drop database if exists hive cascade;            #删除数据库和它中的表

drop database db_hive cascade;                      #如果数据库不为空,可以采用cascade命令,强制删除

注意,除 dbproperties属性外,数据库的元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置,没有办法删除或重置数据库属性。

 

创建、修改和删除表

创建表的基本语法

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

[(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]

[STORED AS file_format]

[LOCATION hdfs_path]

 

(1)CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。

(2)EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。

(3)COMMENT:为表和列添加注释。

(4)PARTITIONED BY创建分区表

(5)CLUSTERED BY创建分桶表

(6)SORTED BY不常用

(7)ROW FORMAT

DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]

[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]

| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, …)]

用户在建表的时候可以自定义SerDe或者使用自带的SerDe。如果没有指定ROW FORMAT 或者ROW FORMAT DELIMITED,将会使用自带的SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。SerDe是Serialize/Deserilize的简称,目的是用于序列化和反序列化。

(8)STORED AS指定存储文件类型

常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)

如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。

(9)LOCATION :指定表在HDFS上的存储位置。

(10)LIKE允许用户复制现有的表结构,但是不复制数据。

 

#创建内部表(管理表)

create table if not exists hive.usr(

      name string comment 'username',

      pwd string comment 'password',

      address struct<street:string,city:string,state:string,zip:int>,

      comment  'home address',

      identify map<int,tinyint> comment 'number,sex')

      comment 'description of the table' 

     tblproperties('creator'='me','time'='2016.1.1');

#创建外部表

create external table if not exists usr2(

      name string,

      pwd string,

  address struct<street:string,city:string,state:string,zip:int>,

      identify map<int,tinyint>)

      row format delimited fields terminated by ','

     location '/usr/local/hive/warehouse/hive.db/usr';

#创建分区表

create table if not exists usr3(

      name string,

      pwd string,

      address struct<street:string,city:string,state:string,zip:int>,

      identify map<int,tinyint>)

      partitioned by(city string,state string);   

#复制usr表的表模式 

create table if not exists hive.usr1 like hive.usr;

show tables in hive; 

show tables 'u.*';                                #查看hive中以u开头的表

describe hive.usr;                               #查看usr表相关信息

alter table usr rename to custom;         #重命名表

#为表增加一个分区

alter table usr2 add if not exists

     partition(city=”beijing”,state=”China”)

     location '/usr/local/hive/warehouse/usr2/China/beijing';

#修改分区路径

alter table usr2 partition(city=”beijing”,state=”China”)

     set location '/usr/local/hive/warehouse/usr2/CH/beijing';

#删除分区

alter table usr2 drop if exists  partition(city=”beijing”,state=”China”)

#修改列信息

alter table usr change column pwd password string after address;

alter table usr add columns(hobby string);                             #增加列

alter table usr replace columns(uname string);                          #删除替换列

alter table usr set tblproperties('creator'='liming');                          #修改表属性

alter table usr2 partition(city=”beijing”,state=”China”)                       #修改存储属性

set fileformat sequencefile;            

use hive;                                                      #切换到hive数据库下

drop table if exists usr1;                                            #删除表

drop database if exists hive cascade;                                 #删除数据库和它中的表

 

修改表:

ALTER TABLE name RENAME TO new_name

ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...])

ALTER TABLE name DROP [COLUMN] column_name

ALTER TABLE name CHANGE column_name new_name new_type

ALTER TABLE name REPLACE COLUMNS (col_spec[, col_spec ...])

 

查看表类型

desc formatted student2;

 

修改内部表为外部表

alter table student2 set tblproperties('EXTERNAL'='TRUE');

 

修改外部表为内部表

alter table student2 set tblproperties('EXTERNAL'='FALSE');

 

分区表

分区表实际就是对应hdfs文件系统上的的独立的文件夹,该文件是夹下是该分区所有数据文件。

CREATE external TABLE IF NOT EXISTS

stup ( id int, name string, gender string, birthday date, phone string, loc string)

partitioned by (clazz string)   #按照什么分区(clazz 为分区类别,string为类型)

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; #分隔符

为分区加载数据

load data [local] inpath '/opt/module/datas/student.txt' overwrite | into table student [partition (partcol1=val1,…)];

(1)load data:表示加载数据

(2)local:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表

(3)inpath:表示加载数据的路径

(4)overwrite:表示覆盖表中已有数据,否则表示追加

(5)into table:表示加载到哪张表

(6)student:表示具体的表

(7)partition:表示上传到指定分区

 

建表实例1:

创建部门表

create external table if not exists default.dept(

deptno int,

dname string,

loc int

)

row format delimited fields terminated by '\t';

创建员工表

create external table if not exists default.emp(

empno int,

ename string,

job string,

mgr int,

hiredate string,

sal double,

comm double,

deptno int

)

row format delimited fields terminated by '\t';

 

建表实例2:

(0)创建一张表

hive  > create table student(id string, name string) row format delimited fields terminated by '\t';

(1)加载本地文件到hive

hive  > load data local inpath '/opt/module/datas/student.txt' into table default.student;

(2)加载HDFS文件到hive中

上传文件到HDFS

hive  > dfs -put /opt/module/datas/student.txt /user/atguigu/hive;

加载HDFS上数据

hive > load data inpath '/user/atguigu/hive/student.txt' into table default.student;

(3)加载数据覆盖表中已有的数据

上传文件到HDFS

hive > dfs -put /opt/module/datas/student.txt /user/atguigu/hive;

加载数据覆盖表中已有的数据

hive > load data inpath '/user/atguigu/hive/student.txt' overwrite into table default.student;

分区查询

单查询

 select * from dept_partition where month='200109';

联合查询

select * from dept_partition where month='201709'

             union

             select * from dept_partition where month='201708'

增加分区

创建单个分区

hive > alter table dept_partition add partition(month='201706') ;

同时创建多个分区

hive > alter table dept_partition add partition(month='201705') partition(month='201704');

删除分区

删除单个分区

hive > alter table dept_partition drop partition (month='201704');

同时删除多个分区

hive > alter table dept_partition drop partition (month='201705'), partition (month='201706');

查看分区表有多少分区

hive> show partitions dept_partition;

查看分区表结构

    hive> desc formatted dept_partition;

    # Partition Information         

    # col_name              data_type               comment            

    month                   string 

 

建表实例3:

1.创建一张分区表

hive > create table student(id int, name string) partitioned by (month string) row format delimited fields terminated by '\t';

2.基本插入数据

hive  > insert into table  student partition(month='201709') values(1,'wangwu');

3.基本模式插入(根据单张表查询结果)

hive  > insert overwrite table student partition(month='201708')

             select id, name from student where month='201709';

 

#建表实例4

Hive有三种复杂数据类型ARRAY、MAP 和 STRUCT。ARRAY和MAP与Java中的Array和Map类似,而STRUCT与C语言中的Struct类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。

案例实操

1) 假设某表有如下一行,我们用JSON格式来表示其数据结构。在Hive下访问的格式为

{

    "name": "songsong",

    "friends": ["bingbing" , "lili"] ,       //列表Array,

    "children": {                      //键值Map,

        "xiao song": 18 ,

        "xiaoxiao song": 19

    }

    "address": {                      //结构Struct,

        "street": "hui long guan" ,

        "city": "beijing"

    }

}

2)基于上述数据结构,我们在Hive里创建对应的表,并导入数据。

创建本地测试文件test.txt

songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing

yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing

注意:MAP,STRUCT和ARRAY里的元素间关系都可以用同一个字符表示,这里用“_”。

3)Hive上创建测试表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';

字段解释:

row format delimited fields terminated by ‘,’ – 列分隔符

collection items terminated by ‘_’ --MAP STRUCT 和 ARRAY 的分隔符(数据分割符号)

map keys terminated by ‘:’ – MAP中的key与value的分隔符

lines terminated by ‘\n’; – 行分隔符

4)导入文本数据到测试表

hive (default)> load data local inpath ‘/opt/module/datas/test.txt’into table test;

5)访问三种集合列里的数据,以下分别是ARRAY,MAP,STRUCT的访问方式

hive (default)> select friends[1],children['xiao song'],address.city from test where name="songsong";

OK

_c0     _c1     city

lili    18      beijing

Time taken: 0.076 seconds, Fetched: 1 row(s)

 

 

视图和索引的创建、修改和删除

create view view_name as....;                                                   #创建视图

alter view view_name set tblproperties(…);                                        #修改视图

因为视图是只读的,所以对于视图只允许改变元数据中的 tblproperties属性。

#删除视图

drop view if exists view_name;

#创建索引

create index index_name on table table_name(partition_name/column_name) 

as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild....;

这里’org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler’是一个索引处理器,即一个实现了索引接口的Java类,另外Hive还有其他的索引实现。

alter index index_name on table table_name partition(...)  rebulid;   #重建索引

如果使用 deferred rebuild,那么新索引成空白状态,任何时候可以进行第一次索引创建或重建。

show formatted index on table_name;                               #显示索引

drop index if exists index_name on table table_name;                     #删除索引

 

用户自定义函数

在新建用户自定义函数(UDF)方法前,先了解一下Hive自带的那些函数。show functions; 命令会显示Hive中所有的函数名称:

 

若想要查看具体函数使用方法可使用describe function 函数名:

 

首先编写自己的UDF前需要继承UDF类并实现evaluate()函数,或是继承GenericUDF类实现initialize()函数、evaluate()函数和getDisplayString()函数。

另外,如果用户想在Hive中使用该UDF需要将我们编写的Java代码进行编译,然后将编译后的UDF二进制类文件(.class文件)打包成一个JAR文件,然后在Hive会话中将这个JAR文件加入到类路径下,在通过create function语句定义好使用这个Java类的函数。

add jar <jar文件的绝对路径>;                           #创建函数

create temporary function function_name;

drop temporary function if exists function_name;               #删除函数

b.数据操作

主要实现的是将数据装载到表中(或是从表中导出),并进行相应查询操作。

 

向表中装载数据

首先创建表stu和course,stu有两个属性id与name,course有两个属性cid与sid。

create table if not exists hive.stu(id int,name string)

row format delimited fields terminated by '\t';

create table if not exists hive.course(cid int,sid int)

row format delimited fields terminated by '\t';

向表中装载数据有两种方法:从文件中导入和通过查询语句插入。

a.从文件中导入

假如这个表中的记录存储于文件stu.txt中,该文件的存储路径为/usr/local/hadoop/examples/stu.txt,内容如下。

stu.txt:

1 xiapi

2 xiaoxue

3 qingqing

下面我们把这个文件中的数据装载到表stu中,操作如下:

load data local inpath '/usr/local/hadoop/examples/stu.txt' overwrite into table stu;

如果stu.txt文件存储在HDFS 上,则不需要 local 关键字。

b.通过查询语句插入

使用如下命令,创建stu1表,它和stu表属性相同,我们要把从stu表中查询得到的数据插入到stu1中:

create table stu1 as select id,name from stu;

上面是创建表,并直接向新表插入数据;若表已经存在,向表中插入数据需执行以下命令:

insert overwrite table stu1 select id,name from stu where(条件);

这里关键字overwrite的作用是替换掉表(或分区)中原有数据,换成into关键字,直接追加到原有内容后。

 

从表中导出数据

a.可以简单拷贝文件或文件夹

命令如下:

hadoop  fs -cp source_path target_path;

b.写入临时文件

命令如下:

insert overwrite local directory '/usr/local/hadoop/tmp/stu'  select id,name from stu;

 

查询操作

主要使用select…from…where…等语句,再结合关键字group by、having、like、rlike等操作。SQL中没有的case…when…then…句式、join操作和子查询操作。

case…when…then…句式和if条件语句类似,用于处理单个列的查询结果,语句如下:

select id,name,

  case

  when id=1 then 'first'

  when id=2 then 'second'

  else 'third'

结果如下:

 

 

Like和RLike

1)使用LIKE运算选择类似的值

2)选择条件可以包含字符或数字:

% 代表零个或多个字符(任意个字符)。

_ 代表一个字符。

3)RLIKE子句是Hive中这个功能的一个扩展,其可以通过Java的正则表达式这个更强大的语言来指定匹配条件。

(1)查找以2开头薪水的员工信息

hive (default)> select * from emp where sal LIKE '2%';

(2)查找第二个数值为2的薪水的员工信息

hive (default)> select * from emp where sal LIKE '_2%';

(3)查找薪水中含有2的员工信息

hive (default)> select * from emp where sal RLIKE '[2]';

 

 

cluster by

cluster by的功能就是distribute by和sort by相结合,如下2个语句是等价的

select mid, money, name from store cluster by mid

select mid, money, name from store distribute by mid sort by mid

 

 

 

 

连接

连接(join)是将两个表中在共同数据项上相互匹配的那些行合并起来, HiveQL 的连接分为内连接、左向外连接、右向外连接、全外连接和半连接 5 种。

a. 内连接(等值连接)
内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行。

首先,我们先把以下内容插入到course表中(自行完成)。

1 3

2 1

3 1

下面, 查询stu和course表中学号相同的所有行,命令如下:

select stu.*, course.* from stu join course on(stu .id=course .sid);

执行结果如下:

 

b. 左连接
左连接的结果集包括“LEFT OUTER”子句中指定的左表的所有行, 而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行, 则在相关联的结果集中右表的所有选择列均为空值,命令如下:

select stu.*, course.* from stu left outer join course on(stu .id=course .sid);

执行结果如下:

 

c. 右连接
右连接是左向外连接的反向连接,将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。命令如下:

select stu.*, course.* from stu right outer join course on(stu .id=course .sid);

执行结果如下:

 

d. 全连接
全连接返回左表和右表中的所有行。当某行在另一表中没有匹配行时,则另一个表的选择列表包含空值。如果表之间有匹配行,则整个结果集包含基表的数据值。命令如下:

select stu.*, course.* from stu full outer join course on(stu .id=course .sid);

执行结果如下:

 

e. 半连接
半连接是 Hive 所特有的, Hive 不支持 in 操作,但是拥有替代的方案; left semi join, 称为半连接, 需要注意的是连接的表不能在查询的列中,只能出现在 on 子句中。命令如下:

select stu.* from stu left semi join course on(stu .id=course .sid);

执行结果如下:

 

子查询

标准 SQL 的子查询支持嵌套的 select 子句,HiveQL 对子查询的支持很有限,只能在from 引导的子句中出现子查询。

注意,在定义或是操作表时,不要忘记指定所需数据库。

4) 简单编程实践

下面我们以词频统计算法为例,来介绍怎么在具体应用中使用Hive。词频统计算法又是最能体现MapReduce思想的算法之一,这里我们可以对比它在MapReduce中的实现,来说明使用Hive后的优势。

MapReduce实现词频统计的代码可以通过下载Hadoop源码后,在 $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar 包中找到(wordcount类),wordcount类由63行Java代码编写而成。下面首先简单介绍一下怎么使用MapReduce中wordcount类来统计单词出现的次数,具体步骤如下:

1)创建input目录,output目录会自动生成。其中input为输入目录,output目录为输出目录。命令如下:

cd /usr/local/hadoop

mkdir input

2)然后,在input文件夹中创建两个测试文件file1.txt和file2.txt,命令如下:

cd  /usr/local/hadoop/input

echo "hello world" > file1.txt

echo "hello hadoop" > file2.txt

3)执行如下hadoop命令:

cd  ..

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount input output

4)我们可以到output文件夹中查看结果,结果如下:

 

 

下面我们通过HiveQL实现词频统计功能,此时只要编写下面7行代码,而且不需要进行编译生成jar来执行。HiveQL实现命令如下:

create table docs(line string);

load data inpath 'file:///usr/local/hadoop/input' overwrite into table docs;

create table word_count as

select word, count(1) as count from

(select explode(split(line,' '))as word from docs) w

group by word

order by word;

执行后,用select语句查看,结果如下:

 

由上可知,采用Hive实现最大的优势是,对于非程序员,不用学习编写Java MapReduce代码了,只需要用户学习使用HiveQL就可以了。

 

5) Hive清洗日志数据

 

https://www.cnblogs.com/qq503665965/p/6882827.html

https://blog.csdn.net/WYpersist/article/details/80115041

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值