Hive数据类型和文件格式

news2024/12/28 3:04:35

文章目录

  • Hive数据类型和文件格式
    • 1 基本数据类型
    • 2. 集合数据类型
      • 2.1 Struct举例
      • 2.2 Array举例
      • 2.3 Map举例
    • 3 数据类型转换
      • 3.1 隐式转换
      • 3.2 显示转换
    • 4 文本文件数据编码

Hive数据类型和文件格式

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

1 基本数据类型

Hive 数据类型Java 数据类型长度例子
TINYINTbyte1byte 有符号整数20
SMALINTshort2byte 有符号整数20
INTint4byte 有符号整数20
BIGINTlong8byte 有符号整数20
BOOLEANboolean布尔类型,true 或者falseTRUE、FALSE
FLOATfloat单精度浮点数3.14159
DOUBLEdouble双精度浮点数3.14159
STRINGstring字符系列。可以指定字符集。可以使用单引号或者双引号。’ 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>
MAPMAP是一组键-值对元组集合,可以通过key来访问元素。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->‘John’和’last’->‘Doe’,那么可以通过字段名[‘last’]获取最后一个元素map<string, int>
ARRAYARRAY是由一系列具有相同数据类型的元素组成的集合,这些些素可以通过下标来访问。例如有一个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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/622461.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KDZD绝缘油介质损耗电阻率测试仪参数

一、概述 测试仪依据GB/T5654-2007《液体绝缘材料相对电容率、介质损耗因数和直流电阻率的测量》设计制造。用于绝缘油等液体绝缘介质的介质损耗因数和直流电阻率的测量。 一体化结构。内部集成了介损油杯、温控仪、温度传感器、介损测试电桥、交流试验电源、标准电容器、高阻计…

无线无源中继采发仪在工程监测中的应用

无线无源中继采发仪在工程监测中的应用 随着科技的不断发展&#xff0c;无线传感技术在工程监测中的应用越来越广泛。其中&#xff0c;无线无源中继采发仪是一种新型的数据采集设备&#xff0c;能够将传感器数据通过无线信号传输到数据中心。本文旨在探讨无线无源中继采发仪在…

Scrum敏捷项目管理

在了解敏捷项目管理之前&#xff0c;我们先看下敏捷和传统项目管理有什么区别。 传统项目管理&#xff1a;阶段式项目管理模式。 制定详细的计划和步骤&#xff0c;按计划执行&#xff0c;直到所有的计划执行全部结束。咖 敏捷项目管理模式&#xff0c;从愿景和高价值的目标出…

基于摄影测量的三维重建【终极指南】

我们生活的时代非常令人兴奋&#xff0c;如果你对 3D 东西感兴趣&#xff0c;更是如此。 我们有能力使用任何相机&#xff0c;从感兴趣的物体中捕捉一些图像数据&#xff0c;并在眨眼间将它们变成 3D 资产&#xff01; 这种通过简单的数据采集阶段进行的 3D 重建过程是许多行业…

k8s service与ingress

1.前言 service只能作用与网络模型中的四层&#xff0c;ingress可以作用于网络模型中的七层&#xff0c;Service是一种抽象&#xff0c;定义了一个逻辑上的一组Pod以及访问它们的策略。Service为Pod提供了一个稳定的IP地址和DNS名称&#xff0c;并通过标签选择器来定义需要暴露…

SpringBoot_Vue3 《Hello World》项目入门教程

1. 前言 前后端分离模式&#xff0c;可以让后端和前端开发人员致力于自己擅长的领域&#xff0c;且可以让前端和后端业务逻辑高度解耦合。本文从一个简单的案例入手&#xff0c;讲解使用 spring boot和vue3如何实现前后端的分离。 前后端分离有2 种模式&#xff1a; 逻辑分离…

华为OD机试真题 JavaScript 实现【在字符串中找出连续最长的数字串】【2023 B卷 100分】,附详细解题思路

一、题目描述 输入一个字符串&#xff0c;返回其最长的数字子串&#xff0c;以及其长度。 若有多个最长的数字子串&#xff0c;则将它们全部输出&#xff08;按原字符串的相对位置&#xff09;。 本题含有多组样例输入。 数据范围&#xff1a; 字符串长度 1≤n≤200 &…

【LeetCode】240. 搜索二维矩阵 II

240. 搜索二维矩阵 II&#xff08;中等&#xff09; 这道题和 74. 搜索二维矩阵 基本一致&#xff0c;可以放在一起做。 方法一&#xff1a;变形的二叉搜索树 思路 这种做法和 74. 搜索二维矩阵完全一致。 我们可以将二维矩阵抽象成「以右上角为根的 BST」&#xff1a; 那…

基于python五子棋的设计与实现(论文+源码)_kaic

目 录 摘 要 绪 论 一、游戏的需求分析 &#xff08;一&#xff09;游戏设计目标 &#xff08;二&#xff09;游戏的功能需求 1.可视化模块 2.玩家操作模块 3.胜负判定模块 &#xff08;三&#xff09;游戏的性能需求 &#xff08;四&#xff09;游戏其它需求 二、五子棋游戏…

JDK1.8环境安装及配置

JDK1.8环境安装及配置 一、下载JDK1.8二、安装三、环境变量配置四、验证 一、下载JDK1.8 本教程使用的是8u202版本&#xff0c;若需要其他版本可点击下方链接跳转下载。 Oracle下载&#xff0c;点击跳转选择版本 如下图所示&#xff0c;选择自己需要的版本下载 点击8u202版本…

斯坦福《Transformers集结》;大语言模型“书生・浦语“发布

&#x1f989; AI新闻 &#x1f680; 上海人工智能实验室发布1040亿参数大语言模型"书生・浦语"&#xff0c;在多项考试中超越ChatGPT 摘要&#xff1a;上海人工智能实验室近日发布了一个千亿级参数大语言模型——“书生・浦语”。该模型在多领域测试中表现优秀&am…

linuxOPS基础_linux计划任务

什么是计划任务 作用&#xff1a;操作系统不可能24 小时都有人在操作&#xff0c;有些时候想在指定的时间点去执行任务&#xff08;例如&#xff1a;每天凌晨 2 点去重新启动httpd>阿帕奇&#xff09;&#xff0c;此时不可能真有人每天夜里 2 点去执行命令&#xff0c;这就…

大手笔!微软一口气在 GitHub 开源了 5 个技术教程。。

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 此前&#xff0c;我曾介绍过微软在 GitHub 开源的一系列面向初学者的技术教程。 现如今&#xff0c;两年时间过去了&#xff0c;这些教程都更新了不少内容&#xff0c;另外还新增了人工智能…

百度离线资源治理

作者 | 百度MEG离线优化团队 导读 近些年移动互联网的高速发展驱动了数据爆发式的增长&#xff0c;各大公司之间都在通过竞争获得更大的增长空间&#xff0c;大数据计算的效果直接影响到公司的发展&#xff0c;而这背后其实依赖庞大的算力及数据作为支撑&#xff0c;因此在满足…

如何熟练的运用数学模型在水环境影响评价、防洪评价与排污口论证项目中的方法

数学模型在水环境评价、防洪评价和排污口论证等领域中的重要作用&#xff0c;随着人类活动的不断增加和环境问题的日益突出&#xff0c;对水资源和水环境的保护与管理变得至关重要。为了更好地理解和应对这些挑战&#xff0c;数学模型成为一种强大的工具&#xff0c;能够提供量…

使用HHDESK完成网站穿透

在工作和学习中&#xff0c;有很多内网网站&#xff0c;不能通过公网进行访问&#xff0c;需要特定的IP&#xff1b;而IP费用极高&#xff0c;比如按IP收费&#xff0c;费用根据流量带宽来&#xff0c;——这着实是一笔很大的开支。 而通过HHDESK&#xff0c;使用hhtp协议代理…

软考A计划-系统架构师-官方考试指定教程-(5/15)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

Win10安装Java 配置环境变量

文章目录 概要下载jdk安装jdk配置环境变量测试环境变量是否配置成功总结 概要 学习java开发首先需要安装jdk,并设置环境变量。 接下来就来介绍一下如何在 windows 10 系统中配置java环境变量 下载jdk https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe…

【手撕Spring源码】一些值得注意的Spring底层细节

文章目录 FactoryBeanIndexed 原理Spring代理的特点Value 装配底层Autowired 装配底层事件监听器模拟事件发布器 FactoryBean FactoryBean是一个Factory对象,用于生成其他bean示例。当一个bean实现FactoryBean接口后,Spring容器调用其getObject方法返回该工厂所生成的bean,而不…

elasticsearch 8.2.3 安装及springboot简单使用

一、下载安装 官网下载地址https://www.elastic.co/cn/downloads/elasticsearch 解压 elasticsearch-8.2.3-windows-x86_64 修改配置 elasticsearch-8.2.3\config\elasticsearch.yml # Elasticsearch Configuration # # NOTE: Elasticsearch comes with reasonable…