Apache Hive的基本使用语法(一)

news2024/12/22 22:42:30

一、数据库操作

  • 创建数据库
create database if not exists myhive;
  • 查看数据库
use  myhive;
desc  database  myhive;

在这里插入图片描述

  • 创建数据库并指定hdfs存储
create database myhive2 location '/myhive2';
  • 删除空数据库(如果有表会报错)
drop  database  myhive;
  • 强制删除数据库,包含数据库下的表一起删除
drop  database  myhive cascade;
  • 数据库和HDFS的关系
  1. Hive的库在HDFS上就是一个以.db结尾的目录
  2. 默认存储在:/user/hive/warehouse内
  3. 可以通过LOCATION关键字在创建的时候指定存储目录
  • Hive中可以创建的表有好几种类型, 分别是:
  1. 内部表
  2. 外部表
  3. 分区表
  4. 分桶表

二、Hive SQL语法

1、表操作

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 DELIMITED | SERDE serde_name WITH SERDEPROPERTIES(property_name=property_value,..)] [STORED AS file_format] [LOCATION hdfs_path]

[] 中括号的语法表示可选。
| 表示使用的时候,左右语法二选一。
建表语句中的语法顺序要和语法树中顺序保持一致。

字段简单说明

  • CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项 来忽略这个异常。
  • EXTERNAL 外部表
  • COMMENT: 为表和列添加注释。
  • PARTITIONED BY 创建分区表
  • CLUSTERED BY 创建分桶表
  • SORTED BY 排序不常用
  • ROW FORMAT DELIMITED 使用默认序列化LazySimpleSerDe 进行指定分隔符
  • SERDE 使用其他序列化类 读取文件
  • STORED AS 指定文件存储类型
  • LOCATION 指定表在HDFS上的存储位置。
  • LIKE 允许用户复制现有的表结构,但是不复制数据
  • 数据类型
    在这里插入图片描述
  • 创建表
CREATE TABLE test(id INT, name STRING, gender STRING);
  • 删除表
DROP TABLE test;

2、内部表操作

  • 默认创建的就是内部表,如下举例:
create database if not exists myhive;
use myhive;
create table if not exists stu2(id int,name string);
insert into stu2 values (1,"zhangsan"), (2, "lisi");
select * from stu2;
  • 在HDFS上,查看表的数据存储文件
    在这里插入图片描述

3、外部表操作

 # 创建外部表
create external table test_ext(id int, name string) row format delimited fields terminated by '\t' location '/tmp/test_ext';
# 可以看到,目录/tmp/test_ext被创建
select * from test_ext #空结果,无数据
# 上传数据: 
hadoop fs -put test_external.txt /tmp/test_ext/ 
#现在可以看数据结果
select * from test_ext 
# 删除外部表(但是在HDFS中,数据文件依旧保留)
drop table test_ext;
  • 内外部表转换(EXTERNAL=TRUE 外或FALSE 内,注意字母大写)
alter table stu set tblproperties('EXTERNAL'='TRUE');

4、数据加载和导出

  • 先建表
CREATE TABLE myhive.test_load(
  dt string comment '时间(时分秒)', 
  user_id string comment '用户ID', 
  word string comment '搜索词',
  url string comment '用户访问网址'
) comment '搜索引擎日志表' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
  • 数据加载方式一:基于HDFS进行load加载数据(不保留原始文件)
load data local inpath '/home/hadoop/search_log.txt' into table myhive.test_load;

search_log.txt文件内容如下:
在这里插入图片描述

  • 数据加载方式二:将SELECT查询语句的结果插入到其它表中,被SELECT查询的表可以是内部表或外部表(保留原始文件)
INSERT INTO TABLE tbl1 SELECT * FROM tbl2;
INSERT OVERWRITE TABLE tbl1 SELECT * FROM tbl2;
  • 将查询的结果导出到本地 - 使用默认列分隔符
insert overwrite local directory '/home/hadoop/export1' select * from test_load ;
  • 将查询的结果导出到本地 - 指定列分隔符
insert overwrite local directory '/home/hadoop/export2' row format delimited fields terminated by '\t' select * from test_load;
  • 将查询的结果导出到HDFS上(不带local关键字)
insert overwrite directory '/tmp/export' row format delimited fields terminated by '\t' select * from test_load;
  • hive表数据导出
bin/hive -e "select * from myhive.test_load;" > /home/hadoop/export3/export4.txt

bin/hive -f export.sql > /home/hadoop/export4/export4.txt

5、分区表

  • 在大数据中,最常用的一种思想就是分治,我们可以把大的文件切割划分成一个个的小的文件,这样每次操作一个小的文件就会很容易了
    同样的道理,在hive当中也是支持这种思想的,就是我们可以把大的数据,按照每天,或者每小时进行切分成一个个的小的文件,这样去操作小的文件就会容易得多了。
    在这里插入图片描述
  • 基本语法
    create table tablename(...) partitioned by (分区列 列类型, ......) row format delimited fields terminated by '';
  • 创建分区表
create table score(s_id string, c_id string, s_score int) partition by (month string) row format delimited fields terminated by '\t';
  • 创建多个分区表
create table score(s_id string, c_id string, s_score int) partition by (year string,month string,day string) row format delimited fields terminated by '\t';
  • 加载数据到分区表中
load data local inpath '/export/server/hivedata/score.txt' into table score partition(month='202403');
  • 加载数据到多分区表中
load data local inpath '/export/server/hivedata/score.txt' into table score partition(year='2024',month='03',day='27');
  • 查看分区表
show partitions score;
  • 添加一个分区
alter table score add partition(month='202403');
  • 同时添加多个分区
alter table score add partition(month='202403') partition(month='202402');
  • 删除分区
alter table score drop partition(month='202403');

6、分桶表

  • 开启分桶的自动优化(自动匹配reduce task数量和桶数量一致)
set hive.enforce.bucketing=true;
  • 创建分桶表
create table course (c_id string,c_name string,t_id string) clustered by(c_id) into 3 buckets row format delimited fields terminated by '\t';
  • 桶表的数据加载,由于桶表的数据加载通过load data无法执行,只能通过insert select.
    所以,比较好的方式是:
  1. 创建一个临时表(外部表或内部表均可),通过load data加载数据进入表
  2. 然后通过insert select 从临时表向桶表插入数据
# 创建普通i表
create table course_common(c_id string, c_name string, t_id string) row format delimited fields terminated by '\t';
# 普通表中加载数据
load data local inpath '/export/server/hivedata/course.txt' into table course_common;
# 通过insert overwrite给桶表加载数据
insert overwrite table course select * from course_common cluster by(c_id);
  • 为什么不可以用load data,必须用insert select插入数据:
  1. 问题就在于:如何将数据分成三份,划分的规则是什么?
  2. 数据的三份划分基于分桶列的值进行hash取模来决定
  3. 由于load data不会触发MapReduce,也就是没有计算过程(无法执行Hash算法),只是简单的移动数据而已
    所以无法用于分桶表数据插入。
  • Hash取模
  1. Hash算法是一种数据加密算法,其原理我们不去详细讨论,我们只需要知道其主要特征:
  • 同样的值被Hash加密后的结果是一致的
    比如字符串“hadoop”被Hash后的结果是12345(仅作为示意),那么无论计算多少次,字符串“hadoop”的结果都会是12345。
    比如字符串“bigdata”被Hash后的结果是56789(仅作为示意),那么无论计算多少次,字符串“bigdata”的结果都会是56789。
  1. 基于如上特征,在辅以有3个分桶文件的基础上,将Hash的结果基于3取模(除以3 取余数)
    那么,可以得到如下结果:
  • 无论什么数据,得到的取模结果均是:0、1、2 其中一个
  • 同样的数据得到的结果一致,如hadoop hash取模结果是1,无论计算多少次,字符串hadoop的取模结果都是1

跳转到《Apache Hive的基本使用语法(二)》

至此,分享结束!!!

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

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

相关文章

ubuntu之搭建samba文件服务器

1. 在服务器端安装samba程序 sudo apt-get install samba sudo apt-get install smbclient 2.配置samba服务 sudo gedit /etc/samba/smb.conf 在文件末尾追加入以下配置 [develop_share] valid users ancy path /home/ancy public yes writable y…

Python文件操作命令

文件操作 我知道你最近很累,是那种看不见的、身体上和精神上的疲惫感,但是请你一定要坚持下去。就算无人问津也好,技不如人也好,千万别让烦躁和焦虑毁了你的热情和定力。别贪心,我们不可能什么都有,也别灰心…

亚信安全荣获2023年度5G创新应用评优活动两项大奖

近日,“关于2023 年度5G 创新应用评优活动评选结果”正式公布,亚信安全凭借在5G安全领域的深厚积累和创新实践,成功荣获“5G技术创新的优秀代表”和“5G应用创新的杰出实践”两项大奖。 面向异构安全能力的5G安全自动化响应系统 作为5G技术创…

【C语言】结构体详解(一)

目录 1、什么是结构体? 2、结构体成分 3、结构体变量的定义与初始化 3.1、结构体变量的三种定义方式 3.2、结构体变量的初始化 4、结构体成员的访问(两种方式) 4.1、直接访问 4.2、间接访问 5、结构的特殊声明 5.1、不完全声明(匿…

白色微立体的智能界面,就喜欢这种简洁白净。

本次发一些微立体风格的智能家居界面,风格为微立体,也叫轻拟物风格,或者新拟态风格。

规划控制如何兼顾安全与舒适性

规划控制如何兼顾安全与舒适性 附赠自动驾驶学习资料和量产经验:链接 **导读:**自动驾驶技术研发对于“安全第一”的追求是毋庸置疑的,但是这中间可能就忽视了舒适性。 因此,今天我想给大家分享的是,自动驾驶研发如何…

探究ThreadLocal的魔数0x61c88647和Entry数组

探究ThreadLocal 下面有一个很重要的HASH_INCREMENT,他的值是0x61c88647 public class ThreadLocal<T> {/***ThreadLocals依赖于附加到每个线程的每线程线性探针哈希映射 (thread.threadLocals和inheritableThreadLocals)。ThreadLocal对象充当键&#xff0c;通过threa…

uniApp使用XR-Frame创建3D场景(4)金属度和粗糙度

上一篇讲解了如何在uniApp中创建xr-frame子组件并创建简单的3D场景。 这一篇我们讲解xr-frame中关于mesh网格材质的金属度和粗糙度的设置。 1.先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"> <xr-node visible"{…

Java使用数组实现栈、队列、堆

数组模拟栈&#xff1a; const int N 10010; // ******************** 栈 int stk[N], tt//tt是下标; // 插入 stk[k] x; // 删除 tt--; // 判断栈是否为空 if (tt > 0) not empty else empty // 栈顶 stk[tt]; // ******************** 队列 // 在队尾插入…

可视化图表:关系图,一图分清父子兄弟关系。

Hi&#xff0c;我是贝格前端工场的老司机&#xff0c;本文分享可视化图表设计的关系图设计&#xff0c;欢迎老铁持续关注我们。 在现代信息爆炸的时代&#xff0c;我们需要从庞大的数据中提取有用的信息和洞察。而可视化图表作为数据分析和展示的重要工具之一&#xff0c;被广泛…

《新机器智能》的深度解读与感悟

《新机器智能》的深度解读与感悟 引言[1] 脑科学对于人工智能研发的意义[2] 新皮质建立了世界模型[3] 记忆-预测模型[4] 记忆-预测模型是如何工作的[5] 意识与创造力[6] 智能的未来1.我们能创造人工智能吗&#xff1f;2.我们应该制造智能机器吗&#xff1f;3.智能机器能做些什么…

Node Sass does not yet support your current environment

项目运行时报错&#xff1a;Node Sass does not yet support your current environment 原因是node版本过高。 解决办法&#xff1a; 使用nvm管理node版本&#xff0c;&#xff08;如何安装nvm&#xff1f;请点击跳转&#xff09; 具体步骤如下&#xff1a; 1.查看当前node…

C++中使用虚函数实现多态

虚函数是C中用于实现多态&#xff08;Polymorphism&#xff09;的重要特性。下面是关于虚函数的讲解和代码示例&#xff1a;### 虚函数的定义&#xff1a; 虚函数是在基类中声明为 virtual 的成员函数。 在派生类中重写&#xff08;override&#xff09;这个虚函数&#xff0c;…

Python编码和字符操作

编码和字符操作 .你觉得&#xff0c;迷茫的反义词是什么&#xff1f;有些人可能会说是坚定&#xff0c;但还有另一种说法&#xff1a;迷茫的反义词是具体。当你从一件件具体的事开始着手&#xff0c;焦虑就会一点点退去。——《夜读》 编码操作 UTF8编码 当谈到字符编码时&am…

酷得单片机方案 2.4G儿童遥控漂移车

电子方案开发定制&#xff0c;我们是专业的 东莞酷得智能单片机方案之2.4G遥控玩具童车具有以下比较有特色的特点&#xff1a; 1、内置充电电池&#xff1a;这款小车配备了可充电的电池&#xff0c;无需频繁更换电池&#xff0c;既环保又方便。充电方式可能为USB充电或者专用…

重新温习广软puthon爬虫技术。

下面是我不断试错的一个过程&#xff0c;好多知识点全忘记了&#xff0c;只能不断调实例&#xff0c;不断优化&#xff0c;重构&#xff0c;实现自己的需求。下面是我的运行截图。还是导包的问题。 个人感觉关键的还是这几部&#xff0c;被划了下划线的&#xff0c;存在问题&a…

通知中心架构:打造高效沟通平台,提升信息传递效率

随着信息技术的快速发展&#xff0c;通知中心架构作为一种关键的沟通工具&#xff0c;正逐渐成为各类应用和系统中必不可少的组成部分。本文将深入探讨通知中心架构的意义、设计原则以及在实际场景中的应用。 ### 什么是通知中心架构&#xff1f; 通知中心架构是指通过集中管…

MySQL - 高阶语句(一)

先准备一张表 create table class1 (id int,name varchar(10) primary key not null ,score decimal(5,2),address varchar(20),hobbid int(5));insert into class1 values(1,liuyi,80,beijing,2); insert into class1 values(2,wangwu,90,shengzheng,2); insert into class1 …

Linux通过进程组和会话理解守护进程---代码实现一个服务进程

进程组和会话 这一个课程的笔记 概念和特性 进程组 也称之为作业。BSD于1980年前后向Unix中增加的一个新特性。代表一个或多个进程的集合。每个进程都属于一个进程组。在waitpid函数和kill函数的参数中都曾使用到。操作系统设计的进程组的概念&#xff0c;是为了简化对多个进…

酒店管理系统项目用例图及用例说明

1、系统功能模块图 2、部分系统功能模块说明 &#xff08;1&#xff09;查询房间剩余 模块名称&#xff1a;管理员登录 编号&#xff1a;1-1 主要功能&#xff1a;验证管理员登录用户名及密码 上级调用模块&#xff1a;无 下级调用模块&#xff1a; 约束&#xff1a; &a…