Hive数据类型和文件格式

2023-11-07


Hive数据类型和文件格式

Hive支持关系数据库中的大多数基本数据类型,同时也支持3种新的集合数据类型。

1 基本数据类型

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 字符系列。可以指定字符集。可以使用单引号或者双引号。 ’ now is the time '
“for all good men”
TIMESTAMP 时间类型
BINARY 字节数组

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

2. 集合数据类型

Hive中的列支持struct、map和array集合数据类型。

数据类型 描述 语法示例
STRUCT 和 c 语 言 中 的 struct 类 似 , 都 可 以 通过“点”符号访问元素内容。例如,如果某个列的 数 据 类 型 是 STRUCT{first STRING, lastSTRING},那么第1个元素可以通过字段.first来引用。 struct(‘john’,‘Doe’)
struct<street:string,city:string>
MAP MAP是一组键-值对元组集合,可以通过key来访问元素。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->‘John’和’last’->‘Doe’,那么可以通过字段名[‘last’]获取最后一个元素 map<string, int>
ARRAY ARRAY是由一系列具有相同数据类型的元素组成的集合,这些些素可以通过下标来访问。例如有一个ARRAY类型的变量fruits,它是由[‘apple’,‘orange’,‘mango’]组成,那么我们可以 通 过 fruits[1] 来 访 问 元 素 orange , 因 为ARRAY类型的下标是从0开始的。 Array(‘John’, ‘Doe’)
Array

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

2.1 Struct举例

(1)假设有如下两条数据,为了便于理解,以JSON格式来表示它的数据结构:

[
{
	"stuid": 1,
	"stuname":'alan',
	"score":{
		"math":98,
		"computer":89
	}
},
{
	"stuid": 2,
	"stuname":'john',
	"score":{
		"math":95,
		"computer":97
	}
}
]

(2)在目录/root/data中创建本地测试文件struct.txt,保存下面的数据。

1,alan,98_89
2,john,95_97

image-20230402165220464

(3)在Hive上创建测试表test_struct

create table test_struct
(
    stuid   int,
    stuname string,
    score   struct<math:int,computer:int>
)
    row format delimited fields terminated by ','
        collection items terminated by '_'
        lines terminated by '\n';

image-20230402165850513

字段解释:

row format delimited fields terminated by ',' -- 列分隔符
collection items terminated by '_' -- MAP STRUCT和ARRAY的分隔符(数据分割符号)
lines terminated by '\n'; -- 行分隔符

(4)接下来,导入struct.txt中的文本数据到测试表test_struct

load data local inpath '/root/data/struct.txt' into table test_struct;

(5)访问表test_struct中的数据

select * from test_struct;

image-20230402170402595

(6)访问结构中的数据

select stuname,score.math,score.computer from test_struct;

image-20230402170815250

2.2 Array举例

(1)假设有如下两条数据,为了便于理解,以JSON格式来表示它的数据结构:

[
{
	"stuid": 1,
	"stuname":'alan',
	"hobbys":["music","sports"]
},
{
	"stuid": 2,
	"stuname":'john',
	"hobbys":["music","travel"]
}
]

(2)在目录/root/data中创建本地测试文件array.txt,保存下面的数据。

1,alan,music_sports
2,john,music_travel

image-20230402171142636

(3)在Hive上创建测试表test_array

create table test_array
(
    stuid   int,
    stuname string,
    hobbys  array<string>
)
    row format delimited fields terminated by ','
        collection items terminated by '_'
        lines terminated by '\n';

(4)接下来,导入array.txt中的文本数据到测试表test_array

load data local inpath '/root/data/array.txt' into table test_array;

(5)访问表test_array中的数据

select * from test_array;

image-20230402171519356

(6)访问数组中的数据

set hive.cli.print.header=true;
select stuname,hobbys[0] from test_array;

image-20230402171712325

2.3 Map举例

(1)假设有如下两条数据,为了便于理解,以JSON格式来表示它的数据结构:

[
{
	"stuid": 1,
	"stuname":'alan',
	"score":{
		"math":98,
		"computer":89
	}
},
{
	"stuid": 2,
	"stuname":'john',
	"score":{
		"math":95,
		"computer":97
	}
}
]

(2)在目录/root/data中创建本地测试文件 map.txt,保存下面的数据。

1,alan,math:98_computer:89
2,john,math:95_computer:97

image-20230402172011829

(3)在Hive上创建测试表test_map

create table test_map
(
    stuid   int,
    stuname string,
    score   map<string,int>
)
    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)接下来,导入map.txt中的文本数据到测试表test_map

load data local inpath '/root/data/map.txt' into table test_map;

(5)访问表test_map中的数据

set hive.cli.print.header=true;
select * from test_map;

image-20230402172428811

(6)访问map中的数据

select stuname,score['math'] as math,score['computer'] as computer from test_map;

image-20230402172528946

3 数据类型转换

Hive 的原子数据类型是可以进行隐式转换的,类似于 Java 的类型转换。转换的原则是从数据范围小的类型向数据范围大的类型转换,或从数据精度低的类型向数据精度高的类型转换,以保证数据和精度不丢失。例如某表达式使用 BIGINT类型,INT 会自动转换为BIGINT 类型,但是 Hive 不会进行反向转换。例如,某表达式使用 INT 类型,BIGINT 不会自动转换为 INT 类型,它会返回错误,除非使用 CAST 操作。

3.1 隐式转换

(1)任何整数类型都可以隐式地转换为一个范围更广的类型,如 TINYINT 可以转换成 INT,INT 可以转换成 BIGINT。

(2)所有整数类型、FLOAT 和 STRING 类型都可以隐式地转换成 DOUBLE。

(3)TINYINT、SMALLINT、INT 都可以转换为 FLOAT。

(4)BOOLEAN 类型不可以转换为任何其它的类型。

3.2 显示转换

可以使用 CAST 操作进行显示数据类型转换,例如 CAST(‘1’ AS INT)将把字符串’1’ 转换成整数 1;如果强制类型转换失败,如执行 CAST(‘X’ AS INT),表达式返回空值NULL。

select '2'+3,cast('2' as int)+1;

image-20230402172917808

4 文本文件数据编码

Hive中经常经使用未经压缩的文本文件来存储数据,各字段之间如何保证正确分隔,分隔符的选择十分重要,已选定的分隔符不能出现在数据中。Hive默认使用了几个控制字符,这些字符很少出现在字段值中。

分隔符 描述
\n 对于文本文件来说,每行都是一条记录,因此换行符可以分隔记录
^A(Ctrl+V+A) 用于分隔字段(列)。在CREATE TABLE语句中可以使用八进制编码\001表示
^B(Ctrl+V+B) 用于分隔ARRAY或者STRUCT中的元素,或用于MAP中键-值对之间的分隔。在CREATE TABLE语句中可以使用八进制编码\002表示
^C(Ctrl+V+C) 用于MAP中键和值之间的分隔。在CREATE TABLE语句中可以使用八进制编码\003表示

下面是一张员工表:

CREATE TABLE employees
(
    name         STRING,
    salary       FLOAT,
    subordinates ARRAY<STRING>,
    deductions   MAP<STRING,FLOAT>,
    address      STRUCT<street:STRING,city:STRING,state:STRING,zip:INT>
);

其中,字段subordinates(下属员工)是一个字符串数组,字段deductions是一个由键-值对构成的map,其记录了每一次的扣除额。最后,每名员工的家庭住址使用struct数据类型存储。employees表的第1行记录看上去和下面展示的一样,它用到了上面表格中的分隔符。

John Doe^A100000.0^AMary Smith^BTodd Jones^AFederal Taxes^C.2^BState Taxes^C.05^BInsurance^C.1^A1 Michigan Ave.^BChicage^BIL^B60600

在vi中的显示效果如下:

image-20230402175947022

注意:"^A"不是直接按字符键^A直接输入的,而是在编辑状态下按Ctrl+V+A输入的,同理按下Ctrl+V+B可以输入不见字符"^B"。

很显然上面记录的可读性不好,把它转换成可读性好的JSON格式如下:

{
"name": "John Doe",
"salary": 100000.0,
"subordinates": ["Mary Smith","Todd Jones"],
"deductions": {
	"Federal Taxes": .2,
	"State Taxes": .05,
	"Insurance": .1
},
"address": {
	"street": "1 Michigan Ave.",
	"city": "Chicago",
	"state": "IL",
	"zip": 60600
    }
}

用户可以不使用这些默认的分隔符,而指定使用其他分隔符。下面建表语句明确指定了分隔符:

CREATE TABLE employees
(
    name         STRING,
    salary       FLOAT,
    subordinates ARRAY<STRING>,
    deductions   MAP<STRING,FLOAT>,
    address      STRUCT<street:STRING,city:STRING,state:STRING,zip:INT>
)
    row format delimited fields terminated by '\001'
        collection items terminated by '\002'
        map keys terminated by '\003'
        lines terminated by '\n'
    stored as textfile;

目前行分隔符只支持’\n’,不能是别的字符,stored as textfile可以被省略,默认就是 textfile格式的文件。把上面输入的数据加载到employees表中:

load data local inpath '/root/data/employees.txt' into table employees;

查看employees表中的数据

select * from employees;

image-20230402180118502

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hive数据类型和文件格式 的相关文章

随机推荐

  • Ubuntu 18.04 配置ibus中文拼音输入法(超简单)

    Ubuntu 18 04系统想安装中文输入法 利用ibus输入法配置 只要三步 注意 你的Ubuntu需要可以上网 因为要下载一系列安装包 第一步 首先需要给Ubuntu18 04安装Chinese语言包支持 先打开Settings窗口 g
  • playwright连接已有浏览器操作

    文章目录 playwright连接已有浏览器操作 前置准备 打开本地已有缓存的Chrome 理解 指定端口打开浏览器 连接指定端口已启动浏览器 推荐 playwright连接已有浏览器操作 前置准备 pip install playwrig
  • Linux和windows下setsockopt用法

    Linux和windows下setsockopt用法 linux struct timeval timeout 3 0 3s int ret setsockopt sock fd SOL SOCKET SO SNDTIMEO timeout
  • xml 文档树

    xml 文档树 XML documents form a tree structure that starts at the root and branches to the leaves XML 文档树起始于 根元素 并以此为基础扩展文档
  • 优质网址收集

    1 免费PPT模板下载网址都是免费且免登录 网址为 http www ypppt com http 51pptmoban com 2 在线工具网站 包括格式转换 文字识别 图片压缩 视频压缩等 网址为 http www nicetool n
  • python课后作业总结

    课后作业1 一个列表中有多种字符型的元素 要求一将非字符型的全部改成字符型 要求二将所有字符型中的大写字母改成小写 需要用到的知识有 1 lower 函数 功能 将大写字母改成小写 2 列表生成式 s lower for s in L 其中
  • layui生成菜单

    layui生成菜单 thymeleaf渲染 1 ul class layui nav layui nav tree li class layui nav item a href a li ul
  • ARM 64 协程切换上下文的汇编代码解读

    ARM 64协程切换上下文的汇编代码解读 贺志国 2023 8 11 在ARM 64位架构中 有一组通用寄存器 General Purpose Registers 一组浮点寄存器 Floating point Registers 和一组特殊
  • windows10 快捷方式右键失灵问题解决

    问题现象 windows10版本系统 鼠标右键桌面快捷方式的时候 无法展开正常界面 在卡顿2秒后 刷新了整个电脑屏幕 并关闭桌面打开的文件夹 右键无效果 放到文件夹里面尝试也不行 同时选中右键我的电脑展开点击管理 无反应 对应非快捷方式鼠标
  • RocketMQ源码(十三)—消费者DefaultMQPushConsumer启动主要流程源码

    此前我们学习了Broker和Producer的启动源码 以及Producer发送消息源码和Broker接收存储消息的源码 现在 我们来学习Consumer的启动以及消费消息的源码 Consumer的启动源码和Producer的启动源码还是有
  • 计算机四级网络第四套,计算机等级考试【四级网络工程师】第四套预案.doc

    四级网络工程师题库第四套 1 若一个单核处理机的系统中有多个进程存在 则这些进程是 A 并发运行的 B 并行运行的 C 封闭运行的 D 单道运行的 A 解析 并发运行是指在计算机系统中同时存在若干个运行着的程序 各进程均处于已开始运行与结束
  • 多输入多输出

    多输入多输出 MATLAB实现CNN 卷积神经网络 多输入多输出预测 目录 多输入多输出 MATLAB实现CNN 卷积神经网络 多输入多输出预测 预测效果 基本介绍 模型背景 模型结构 程序设计 参考资料 预测效果 基本介绍 MATLAB实
  • 【高危】 Microsoft Teams 远程代码执行漏洞

    漏洞描述 Microsoft Teams 是微软推出的一款团队协作平台 提供了聊天 通话 在线会议 文件共享等功能 Microsoft Teams 受影响版本中 当用户加入攻击者设置的恶意 Microsoft Teams 会议时 攻击者可远
  • mysql与mssql if else的使用语法区别

    mysql if else做为控制流语句的使用 样例 if search condition then statement list elseif search condition then statement list else stat
  • Android 最新实现沉浸式状态栏的效果

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 什么是状态栏 是指手机屏幕最顶上 显示中国移动 安全卫士 电量 网速等等 在手机的顶部 下拉就会出现通知栏 下面我放一张图带大家认识一下
  • 设计模式之【单例模式】

    模式介绍 模式的定义 确保某一个类只有一个实例 而且自行实例化并向整个系统提供这个实例 通用代码 1 饿汉式单例 饿汉式单例 public class Singleton private static final Singleton ins
  • SonarQube异常处理

    2019 07 02 16 42 22 WARN app o s application App SonarQube will require Java 11 starting on next version 2019 07 02 16 4
  • Map和Object:JS如何根据需求选择正确的键值对数据结构

    Map和Object都是JavaScript中常用的数据结构 它们都可以用来存储键值对 key value pairs 但是 它们之间也有一些重要的区别 了解这些区别可以帮助我们选择更合适的数据结构来满足我们的需求 公众号 Code程序人生
  • cmd杀端口号

    使用cmd解决 cmd netstat aon findstr 8761 心塞 被10568等给占用了 taskkill f pid 10568 一步步 把这些端口统统kill 然后一切就ok了 希望对各位有帮助
  • Hive数据类型和文件格式

    文章目录 Hive数据类型和文件格式 1 基本数据类型 2 集合数据类型 2 1 Struct举例 2 2 Array举例 2 3 Map举例 3 数据类型转换 3 1 隐式转换 3 2 显示转换 4 文本文件数据编码 Hive数据类型和文