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数据类型和文件格式 的相关文章

  • Hadoop NoSuchMethodError apache.commons.cli

    我在用着hadoop 2 7 2我用 IntelliJ 做了一个 MapReduce 工作 在我的工作中 我正在使用apache commons cli 1 3 1我把库放在罐子里 当我在 Hadoop 集群上使用 MapReduceJob
  • 如何按行扩展数组值!!使用 Hive SQL

    我有一个有 4 列的表 其中一列 项目 类型是 ARRAY 其他是字符串 ID items name loc id1 item1 item2 item3 item4 item5 Mike CT id2 item3 item7 item4 i
  • 在 Hadoop MapReduce 中为二进制文件创建自定义 InputFormat 和 RecordReader

    我正在编写一个 M R 作业 该作业处理以二进制格式编写的大型时间序列数据文件 如下所示 此处换行以提高可读性 显然 实际数据是连续的 TIMESTAMP 1 TIMESTAMP 1 TIMESTAMP 2 TIMESTAMP 2 TIME
  • 是否可以使用 Java 读写 Parquet,而不依赖 Hadoop 和 HDFS?

    我一直在寻找这个问题的解决方案 在我看来 如果不引入对 HDFS 和 Hadoop 的依赖 就无法在 Java 程序中嵌入读写 Parquet 格式 它是否正确 我想在 Hadoop 集群之外的客户端计算机上进行读写 我开始对 Apache
  • Hadoop-reducer 如何获取数据?

    据我所知 映射器为每个减速器生成 1 个分区 减速器如何知道要复制哪个分区 假设有 2 个节点运行用于字数统计程序的映射器 并且配置了 2 个缩减器 如果每个映射节点生成 2 个分区 并且两个节点中的分区都可能包含相同的单词作为键 那么减速
  • 使用 org.apache.hadoop/* 依赖项离线编译 sbt 时遇到的问题

    使用依赖于 org apache hadoop 包的 sbt 进行离线编译时遇到很多麻烦 一个简单的build sbt name Test version 1 0 scalaVersion 2 10 4 libraryDependencie
  • 如何强制 Spark 执行代码?

    我如何强制 Spark 执行对 map 的调用 即使它认为由于其惰性求值而不需要执行它 我试过把cache 与地图调用 但这仍然没有解决问题 我的地图方法实际上将结果上传到 HDFS 所以 它并非无用 但 Spark 认为它是无用的 简短回
  • ETL informatica 大数据版(非云版)可以连接到 Cloudera Impala 吗?

    我们正在尝试在 Informatica 大数据版本 不是云版本 上进行概念验证 我发现我们可能能够使用 HDFS Hive 作为源和目标 但我的问题是 Informatica 是否连接到 Cloudera Impala 如果是这样 我们是否
  • 如何对 RDD 进行分区

    我有一个文本文件 其中包含大量由空格分隔的随机浮动值 我正在将此文件加载到 scala 中的 RDD 中 这个RDD是如何分区的 另外 是否有任何方法可以生成自定义分区 以便所有分区都具有相同数量的元素以及每个分区的索引 val dRDD
  • 如何在Hadoop中序列化List集合对象?

    有没有办法在 Hadoop 中序列化 java 集合 The Writable接口仅适用于 Java 原语 我有以下类属性 private String keywords private List
  • 更改spark_temporary目录路径

    是否可以更改 temporarySpark在写入之前保存临时文件的目录 特别是 由于我正在编写表的单个分区 因此我希望临时文件夹位于分区文件夹内 是否可以 由于其实现原因 无法使用默认的 FileOutputCommiter FileOut
  • 在 Apache Spark 上下文中,内存数据存储意味着什么?

    我读到 Apache Spark 将数据存储在内存中 然而 Apache Spark 旨在分析大量数据 又称大数据分析 在这种情况下 内存数据存储的真正含义是什么 它可以存储的数据是否受到可用 RAM 的限制 它的数据存储与使用HDFS的A
  • 在 Google Cloud Dataproc 环境中使用 Hadoop 流式处理运行 python map reduce 作业时出错

    我想使用 hadoop 流方法在 Google Cloud Dataproc 中运行 python map reduce 作业 我的map reduce python脚本 输入文件和作业结果输出位于Google Cloud Storage中
  • Spark引擎执行SQL时如何获取hive UDF中Spark的partitionId或taskContext?

    例如我们用Spark引擎执行下面的SQL 我们需要my udf row 返回 Spark 中的分区 id add jar hdfs dir udf udf jar create temporary function my udf as co
  • 以编程方式读取 Hadoop Mapreduce 程序的输出

    这可能是一个基本问题 但我在谷歌上找不到答案 我有一个映射缩减作业 它在其输出目录中创建多个输出文件 我的 Java 应用程序在远程 hadoop 集群上执行此作业 作业完成后 需要使用以下命令以编程方式读取输出org apache had
  • Spark/Yarn:HDFS 上不存在文件

    我在 AWS 上设置了 Hadoop Yarn 集群 有 1 个主服务器和 3 个从服务器 我已经验证我有 3 个活动节点在端口 50070 和 8088 上运行 我在客户端部署模式下测试了 Spark 作业 一切正常 当我尝试使用 Spa
  • Protobuf RPC 在 Hadoop 2.2.0 单节点服务器上不可用?

    我正在尝试在按照本教程安装的本地单节点集群上运行 hadoop 2 2 0 mapreduce 作业 http codesfusion blogspot co at 2013 10 setup hadoop 2x 220 on ubuntu
  • AWS EMR 引导操作为 sudo

    我需要更新 etc hosts适用于我的 EMR 集群 EMR AMI 4 3 中的所有实例 整个脚本无非就是 bin bash echo e ip1 uri1 gt gt etc hosts echo e ip2 uri2 gt gt e
  • Hadoop 作业:任务在 601 秒内无法报告状态

    在伪节点上运行 hadoop 作业时 任务失败并被杀死 错误 任务尝试 在 601 秒内无法报告状态 但同一个程序正在通过 Eclipse 运行 本地作业 任务 大约有 25K 个关键字 输出将是所有可能的组合 一次两个 即大约 25K 2
  • Hadoop fs 查找块大小?

    在 Hadoop fs 中如何查找特定文件的块大小 我主要对命令行感兴趣 例如 hadoop fs hdfs fs1 data 但看起来这并不存在 有Java解决方案吗 The fsck其他答案中的命令列出了块并允许您查看块的数量 但是 要

随机推荐

  • 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数据类型和文