IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Day43_Hive(一) -> 正文阅读

[大数据]Day43_Hive(一)

一、hive概述

(一)hive简介

当我们去尝试使用mapreduce去处理海量数据的时候,发现开发过程中并不是很顺利,经过复杂的需求分析,我们需要设计map、reduce阶段分别要处理什么样的业务逻辑,以及key、value的具体定义,如果可以通过sql来驱动业务,那么即使复杂的业务也会变得相对轻松一些,那么有没有这样的工具来实现我们的想法呢?那么我需要学习认识一下apache又一款优秀的工具:Apache Hive。

Hive是2007年8月由Facebook开源用于解决海量结构化日志的数据统计工具,2008年 6月成为Hadoop的第一个SQL框架,并且成为Hadoop的子项目,2010年9月脱离Hadoop成为Apache顶级项目。

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

其本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据的存储,说白了hive可以理解为一个将SQL转换为MapReduce的任务的工具,甚至更进一步可以说hive就是一个MapReduce的客户端

总结:

为什么要使用hive?

1.采用类SQL语法去操作数据,提供快速开发的能力。

2.避免了去写MapReduce,减少开发人员的学习成本。

3.功能扩展很方便。

(二) hive的特点

其实任何的工具、框架都是有利有弊的,只有明白他们的优缺点,才能在今后工作中面对复杂的业务筛选出更适合业务的工具,在工作中也能很好的定位问题以及解决问题。

优点:

1.操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。

2.避免了去写MapReduce,减少开发人员的学习成本。

3.Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。

4.Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。

5.Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

缺点:

1.Hive的HQL表达能力有限

2.迭代式算法无法表达

3.数据挖掘方面不擅长,由于MapReduce数据处理流程的限制,效率更高的算法却无法实现。

4.Hive的本身效率比较低

5.Hive自动生成的MapReduce作业,通常情况下不够智能化

6.Hive调优比较困难,粒度较粗

(三) hive架构

?????? 当我们明白hive的优缺点以后,就想迫不及待的去体验一下,在这之前我们需要了解它的基础架构,以至于在配置方面了解更深入一些,Hive通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的Driver,结合元数据(MetaStore),将这些指令翻译成MapReduce,提交到Hadoop中执行,最后,将执行返回的结果输出到用户交互接口。

用户接口:Client

CLI(command-line interface)、JDBC/ODBC(jdbc访问hive)、WEBUI(浏览器访问hive)

元数据:Metastore

元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;

默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore

基于Hadoop

使用HDFS进行存储,使用MapReduce进行计算。

驱动器:Driver

解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。

编译器(Physical Plan):将AST编译生成逻辑执行计划。

优化器(Query Optimizer):对逻辑执行计划进行优化。

执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。

(四) 与RDBMS对比

?????? 由于 Hive 采用了类似SQL 的查询语言 HQL(Hive Query Language),因此很容易将 Hive 理解为数据库。其实从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。我们将从多个方面来阐述 Hive 和数据库的差异。数据库可以用在 Online 的应用中,但是Hive 是为数据仓库而设计的,清楚这一点,有助于从应用角度理解 Hive 的特性。

1、查询语言

由于SQL被广泛的应用在数据仓库中,因此,专门针对Hive的特性设计了类SQL的查询语言HQL。熟悉SQL开发的开发者可以很方便的使用Hive进行开发。

2、数据更新

由于Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写、修改少的。因此,Hive中不建议对数据的改写,所有的数据都是在加载的时候确定好的。而数据库中的数据通常是需要经常进行修改的,因此可以使用 INSERT INTO …? VALUES 添加数据,使用 UPDATE … SET修改数据。

hive 不支持update

3、执行延迟

Hive 在查询数据的时候,Hive支持索引,但是Hive的索引与关系型数据库中的索引并不相同,一般需要扫描整个表,因此延迟较高。另外一个导致 Hive 执行延迟高的因素是 MapReduce框架。由于MapReduce 本身具有较高的延迟,因此在利用MapReduce 执行Hive查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。

4、数据规模

由于Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。

总结:

hive具有sql数据库的外表,但应用场景完全不同,hive只适合用来做批量数据统计分析

二、Hive的小试牛刀

Hive是什么相信大家已经了解一些了,我们发现它既然可以和RDBMS相对比,那么一定有特别多的相似之处,而RDBMS中的MySQL我们已经轻车熟路,那么我们一起来带着MySQL的经验一起研究一下Hive。

(一) mysql 5.7 安装部署

1、卸载自带的mariadb

??? MariaDB数据库管理系统是MySQL的一个分支,属于Centos7内置,主要由开源社区在维护,采用GPL授权许可。开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

# 卸载mariadb

rpm -qa | grep -i -E mysql\|mariadb | xargs -n1 sudo rpm -e --nodeps

-qa 查询系统中所有安装的软件包

-i 忽略大小写

-E 指定后边使用正则表达式

\| 或者

-n1 每次只给出一个参数

2、安装配置

(1)myql的安装

cd /home/offcn/software/mysql-5.7
# 安装依赖
sudo rpm -ivh  mysql-community-common-5.7.29-1.el7.x86_64.rpm mysql-community-libs-5.7.29-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.29-1.el7.x86_64.rpm

# 安装client
sudo rpm -ivh mysql-community-client-5.7.29-1.el7.x86_64.rpm

# 安装server
sudo rpm -ivh mysql-community-server-5.7.29-1.el7.x86_64.rpm

(2)mysql的配置

# 启动mysql,设置开机启动
sudo systemctl start mysqld
sudo systemctl enable mysqld

# 查看mysql初始密码
sudo cat /var/log/mysqld.log | grep password
[Note] A temporary password is generated for root@localhost: iVpZlj&9s?Zs

# 修改密码
mysql -u root -p
输入:iVpZlj&9s?Zs
# 第一次使用必须设置复杂密码(由于 mysql 密码策略,此密码必须足够复杂)
set password=password("Qs23=zs32");

# 更改 mysql 密码策略最低限制,大于4位即可
set global validate_password_length=4;
set global validate_password_policy=0;

# 设置密码为root
set password=password("root");

# 修改权限
use mysql;
select user, host from user;
update user set host="%" where user="root";
flush privileges;

(二) hive的安装配置

1、上传、解压、重命名

tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /home/offcn/apps
cd /home/offcn/apps/
mv apache-hive-3.1.2-bin hive-3.1.2

2、基础配置

(1)配置环境变量

sudo vim /etc/profile
#hive-3.1.2
export HIVE_HOME=/home/offcn/apps/hive-3.1.2
export PATH=$PATH:$HIVE_HOME/bin
source /etc/profile

(2)通过hive命令启动hive客户端

问题0:

?需要初始化hive存储元数据的derby数据库

[offcn@bd-offcn-01 hive-3.1.2]$ pwd
/home/offcn/apps/hive-3.1.2
[offcn@bd-offcn-01 hive-3.1.2]$ rm -rf metastore_db/
[offcn@bd-offcn-01 hive-3.1.2]$ schematool -dbType derby -initSchema

问题1:

日志jar报冲突如下:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/offcn/apps/hive-3.1.2/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/offcn/apps/hadoop-3.2.1/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]

问题2:

升级到tez引擎

Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.

问题3:

不能实例化SessionHiveMetaStoreClient

FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient


结束当前客户端进程,发现同级目录下会出现metastore_db目录以及derby.log,将其删除
执行脚本初始化derby数据库
schematool -dbType derby -initSchema

执行成功后再次启动hive
hive> show databases;
OK
default
Time taken: 0.778 seconds, Fetched: 1 row(s)
hive> create database test1;
OK
Time taken: 0.154 seconds
hive> show databases;
OK
default
test1
Time taken: 0.037 seconds, Fetched: 2 row(s)

换一个目录执行hive
hive> show databases;
FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

rm -rf  metastore_db derby.log
schematool -dbType derby -initSchema

再次执行hive
    > show databases;
OK
default
Time taken: 0.838 seconds, Fetched: 1 row(s)

问题4:

换目录执行需要重新初始化元数据库,生成的库文件不可同步

解决方案:

  1. 重命名jar包
  2. 详见3、安装配置Tez
  3. 元数据库问题推荐使用MySQL
  4. 推荐使用beeline客户端

(3)重命名jar包解决日志jar冲突

cd /home/offcn/apps/hive-3.1.2/lib

mv log4j-slf4j-impl-2.10.0.jar log4j-slf4j-impl-2.10.0.jar.bak

(4)修改配置文件更换MySQL数据库存储元数据

a.安装mysql

b.修改配置文件

cd /home/offcn/apps/hive-3.1.2/conf
vim hive-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://bd-offcn-01:3306/metastore?createDatabaseIfNotExist=true&amp;useSSL=false</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>hive.metastore.warehouse.dir</name>
        <value>/user/hive/warehouse</value>
    </property>
    <property>
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
    </property>
</configuration>

# 加载mysql连接驱动包
cd /home/offcn/software/mysql-5.7
cp mysql-connector-java-5.1.48.jar /home/offcn/apps/hive-3.1.2/lib/ 

# 使用mysql作为元数据存储
schematool -dbType mysql -initSchema

# 再次启动hive客户端测试
--创建表
hive> create table student(id int, name string);
--插入数据,此时可以去hdfs查看数据文件,也可以去yarn查看生成的mr任务
hive> insert into student values(1000,"ss");
--查看数据
hive> select * from student;



(5)修改配置文件配置metastore、hiveServer2服务

vim /home/offcn/apps/hive-3.1.2/conf
vim hive-site.xml:添加以下内容
<property>
	<name>hive.metastore.uris</name>
	<value>thrift://bd-offcn-01:9083</value>
</property>

<property>
	<name>hive.server2.thrift.port</name>
	<value>10000</value>
</property>

<property>
	<name>hive.server2.thrift.bind.host</name>
	<value>bd-offcn-01</value>
</property>

<property>
	<name>hive.metastore.event.db.notification.api.auth</name>
	<value>false</value>
</property>

注意:

此时无法直接使用hive命令启动客户端,因为metastore服务没有启动

hive> show databases;

FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

3、服务的启停:

(1)启动metastore服务

hive --service metastore

(2)启动hiveServer2服务

hive --service hiveserver2

(3)启动客户端

注意:hiveserver2启动后,过一会儿再连接
beeline
beeline> !connect jdbc:hive2://bd-offcn-01:10000
Connecting to jdbc:hive2://bd-offcn-01:10000
Enter username for jdbc:hive2://bd-offcn-01:10000: offcn
Enter password for jdbc:hive2://bd-offcn-01:10000: hadoop
Connected to: Apache Hive (version 3.1.2)
Driver: Hive JDBC (version 3.1.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://bd-offcn-01:10000>
0: jdbc:hive2://bd-offcn-01:10000>

也可以打开hive客户端
[offcn@bd-offcn-02 ~]$ hive
hive> show databases;
OK
default
--创建表
hive> create table student(id int, name string);
--插入数据,此时可以去hdfs查看数据文件,也可以去yarn查看生成的mr任务
hive> insert into student values(1000,"ss");
--查看数据
hive> select * from student;

(4)一键启动脚本

# 创建日志目录
cd /home/offcn/logs/
mkdir hive-3.1.2
cd hive-3.1.2/
touch metastore.out hiveserver2.out

# 编写脚本 
cd /home/offcn/bin/
vim hive.sh
#!/bin/bash
if [ $1 = start ];
then
	nohup $HIVE_HOME/bin/hive --service metastore 2>&1> $HOME/logs/hive-3.1.2/metastore.out &
	nohup $HIVE_HOME/bin/hive --service hiveserver2 2>&1> $HOME/logs/hive-3.1.2/hiveserver2.out &
else
	hive_id=`ps -ef | grep RunJar | grep -v grep | awk '{print $2}'`
	for id in $hive_id
	do
		kill -9 $id
		echo "killed $id"
	done
fi

3、hive的三种方式

上面由问题驱动的安装方式引发我们的思考,到底hive该怎么运用呢?在hive的官网上,介绍了3种安装方式,分别对应不同的场景

  • 内嵌模式(元数据保村在内嵌的derby种,允许一个会话链接,尝试多个会话链接时会报错)
  • 本地模式(本地安装mysql 替代derby存储元数据,解决不同目录启动hive元数据无法共享问题)
  • 远程模式(远程安装mysql 替代derby存储元数据,解决hive的服务端和客户端在同一节点启动问题)

注意:生产中推荐使用第三种方式,我们这里也推荐大家使用。

4、安装配置Tez

(1)上传解压重命名

cd /home/offcn/apps

mkdir tez-0.10

cd /home/offcn/software/

tar -zxvf tez-0.10.1-SNAPSHOT.tar.gz -C /home/offcn/apps/tez-0.10/

(2)上传tez的压缩包

hadoop fs -mkdir /tez-0.10

hadoop fs -put tez-0.10.1-SNAPSHOT.tar.gz /tez-0.10

(3)修改tez-site.xml

cd /home/offcn/apps/hadoop-3.2.1/etc/hadoop/
vim tez-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
	<property>
		<name>tez.lib.uris</name>
		<value>${fs.defaultFS}/tez-0.10/tez-0.10.1-SNAPSHOT.tar.gz</value>
	</property>
	<property>
		 <name>tez.use.cluster.hadoop-libs</name>
		 <value>true</value>
	</property>
	<property>
		 <name>tez.am.resource.memory.mb</name>
		 <value>1024</value>
	</property>
	<property>
		 <name>tez.am.resource.cpu.vcores</name>
		 <value>1</value>
	</property>
	<property>
		 <name>tez.container.max.java.heap.fraction</name>
		 <value>0.4</value>
	</property>
	<property>
		 <name>tez.task.resource.memory.mb</name>
		 <value>1024</value>
	</property>
	<property>
		 <name>tez.task.resource.cpu.vcores</name>
		 <value>1</value>
	</property>
</configuration>

(4)修改hadoop的环境变量

cd /home/offcn/apps/hadoop-3.2.1/etc/hadoop/shellprofile.d
vim tez.sh
hadoop_add_profile tez
function _tez_hadoop_classpath
{
    hadoop_add_classpath "$HADOOP_HOME/etc/hadoop" after
    hadoop_add_classpath "/home/offcn/apps/tez-0.10/*" after
    hadoop_add_classpath "/home/offcn/apps/tez-0.10/lib/*" after
}

(5)修改yarn-site.xml

vim yarn-site.xml
<property>
	<name>yarn.nodemanager.vmem-check-enabled</name>
	<value>false</value>
</property>

(6)修改hive-site.xml

cd /home/offcn/apps/hive-3.1.2/conf/
vim hive-site.xml
	<property>
		<name>hive.execution.engine</name>
		<value>tez</value>
	</property>
	<property>
		<name>hive.tez.container.size</name>
		<value>1024</value>
	</property>

(7)分发hadoop的配置文件

cd /home/offcn/apps/hadoop-3.2.1/etc/
scp -r hadoop/ bd-offcn-02:$PWD
scp -r hadoop/ bd-offcn-03:$PWD

(8)测试

进入beeline客户端

create table t1(id int);???????????????

insert into t1 values(1);

(四) hive的基础命令、属性配置

1、Hive常用交互命令

[offcn@bd-offcn-01 ~]$ hive -help
Hive Session ID = aab86c66-46a2-420b-9d50-ddc49e4c0c83
usage: hive
 -d,--define <key=value>          Variable substitution to apply to Hive
                                  commands. e.g. -d A=B or --define A=B
    --database <databasename>     Specify the database to use
 -e <quoted-query-string>         SQL from command line
 -f <filename>                    SQL from files
 -H,--help                        Print help information
    --hiveconf <property=value>   Use value for given property
    --hivevar <key=value>         Variable substitution to apply to Hive
                                  commands. e.g. --hivevar A=B
 -i <filename>                    Initialization SQL file
 -S,--silent                      Silent mode in interactive shell
 -v,--verbose                     Verbose mode (echo executed SQL to the
                                  console)

2、Hive其他命令操作

(1)"-e"不进入hive的交互窗口执行sql语句

hive -e "select * from student;"

(2)"-f"执行脚本中sql语句

vim hivef.sql

select * from student;

hive -f hivef.sql

3、Hive运行日志信息配置

(1)退出hive窗口:

hive(default)>exit;
hive(default)>quit;

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

hive(default)>dfs -ls /;

(3)查看在hive中输入的所有历史命令

(1)进入到当前用户的根目录

(2)查看.hivehistory文件

[offcn@bd-offcn-01 ~]$ cat .hivehistory

4、参数配置方式

(1)配置文件方式

默认配置文件:hive-default.xml

用户自定义配置文件:hive-site.xml

注意:用户自定义配置会覆盖默认配置。另外,Hive也会读入Hadoop的配置,因为Hive是作为Hadoop的客户端启动的,Hive的配置会覆盖Hadoop的配置。配置文件的设定对本机启动的所有Hive进程都有效。

(2)命令行参数方式

启动Hive时,可以在命令行添加-hiveconf param=value来设定参数。

例如:

[offcn@bd-offcn-01 ~]$ hive -hiveconf mapred.reduce.tasks=10;

注意:仅对本次hive启动有效

(3)参数声明方式

可以在HQL中使用SET关键字设定参数

例如:

hive> set mapred.reduce.tasks=100;

注意:仅对本次hive启动有效。

查看参数设置

hive> set mapred.reduce.tasks;

上述三种设定方式的优先级依次递增。即配置文件<命令行参数<参数声明

三、Hive数据类型

针对千变万化的业务,mysql有属于自己的多种数据类型,那么hive也不例外

(一)原生数据类型

hive数据类型

java数据类型

长度

例子

tinyint

byte

1byte有符号整数

20

smalint

short

2byte有符号整数

20

int

int

4byte有符号整数

20

bigint

long

8byte有符号整数

20

boolean

boolean

布尔类型,true或者false

true? false

float

float

单精度浮点数

3.14159

double

double

双精度浮点数

3.14159

string

string

字符系列。可以指定字符集。可以使用单引号或者双引号。

‘hello world’ “hello hadoop”

timestamp

 

时间类型

 122327493795

binary

 

字节数组

 

对于Hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以存储2GB的字符数。

(二)复合数据类型

数据类型

描述

语法示例

struct

和c语言中的struct类似,都可以通过符号访问元素内容。例如,如果某个列的数据类型是struct{first string, last string},那么第1个元素可以通过 字段.first来引用。

例如struct<street:string, city:string>

map

map是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是map,其中键->值对是first->johnlast->doe,那么可以通过字段名[last]获取最后一个元素

例如map<string, int>

array

数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[john, doe],那么第2个元素可以通过数组名[1]进行引用。

例如array<string>

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

演示:

0: jdbc:hive2://bd-offcn-01:10000> select array("hadoop","spark","flink");
+-----------------------------+
|             _c0             |
+-----------------------------+
| ["hadoop","spark","flink"]  |
+-----------------------------+
0: jdbc:hive2://bd-offcn-01:10000> select struct(01,"kitty",171.0,true);
+----------------------------------------------------+
|                        _c0                         |
+----------------------------------------------------+
| {"col1":1,"col2":"kitty","col3":171,"col4":true}  |
+----------------------------------------------------+
0:jdbc:hive2://bd-offcn-01:10000>select map(1,"hadoop",2,"spark");
+-----------------------------------+
|                _c0                |
+-----------------------------------+
| {1:"hadoop",2:"spark",3:"flink"}  |
+-----------------------------------+

(三)类型转化

Hive的原子数据类型是可以进行隐式转换的,类似于java的类型转换,例如某表达式使用int类型,Tinyint会自动转换为int类型,但是hive不会进行反向转化,例如,某表达式使用tinyint类型,Int不会自动转换为tinyint类型,它会返回错误,除非使用cast操作。

1、隐式类型转换

  • 任何整数类型都可以隐式地转换为一个范围更广的类型,如tinyint可以转换成int,int可以转换成bigint。
  • 所有整数类型、float和string类型都可以隐式地转换成double。
  • tinyint、smallint、int都可以转换为float。
  • boolean类型不可以转换为任何其它的类型。

2、CAST函数操强制数据类型转换

例如:

CAST('1' AS INT)将把字符串'1' 转换成整数1,如果强制类型转换时报败,如执行CAST('X' AS INT),表达式返回空值 NULL。

0: jdbc:hive2://bd-offcn-01:10000> select '1'+2, cast('1'as int) + 2,cast('a' as int);

+------+------+-------+

| _c0? | _c1? |? _c2? |

+------+------+-------+

| 3.0? | 3??? | NULL? |

+------+------+-------+
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-09 11:50:45  更:2021-09-09 11:51:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:36:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码