hive数据库表基本操作

news2024/11/20 0:30:00
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 允许用户复制现有的表结构,但是不复制数据

根据数据创建表

案例1
vi 一个user.txt

1,admin,123456,男,18
2,zhangsan,abc123,男,23
3,lisi,654321,女,16

在hive数据库中创建表

use hive01;

create table t_user(
    id int,
    uname string,
    pwd string,
    sex string,
    age int )
row format delimited fields terminated by ','; --指定 字段之间用 , 分隔

当我们创建表后 在HDFS上会产生对应的文件夹 ,默认路径/user/hive/warehouse/hive01.db/t_user,此时这里是一个空文件,将user.txt文件上传到这个位置load data inpath '/t_user.txt' into table t_user ;
select * from t_user;

t_user.idt_user.unamet_user.pwdt_user.sext_user.age
1admin12345618
2zhangsanabc12323
3lisi65432116

案例2

liuyan,tangtang_mimi,liuliu:18_yanyan:14,hui long guan_beijing
jinlian,dalang_qingqing,jinjin:18_lianlian:19_aa:20,chao yang_beijing

结构

{
    "name": "liuyan",
    "friends": ["tangtang" , "mimi"] ,       //列表Array, 
    "children": {                      //键值Map,
        "liuliu": 18 ,
        "yanyan": 14
    }
    "address": {                      //结构Struct,
        "street": "hui long guan" ,
        "city": "beijing" 
    }
}

建表

create table test(
name string,
friends array<string>,
children map<string, int>,
address struct<street:string, city:string>
)
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的分隔符

复杂类型查询操作

1.数组

- arr[index]   取值
- size(arr)     长度
- 数组角标越界返回NULL
- explode(arr)

select name,friend[0],friend[1],friend[2] from t_user2;
+----------+-----------+-----------+-------+
|   name   |    _c1    |    _c2    |  _c3  |
+----------+-----------+-----------+-------+
| liuyan   | tangtang  | mimi      | NULL  |
| jinlian  | dalang    | qingqing  | NULL  |
+----------+-----------+-----------+-------+

select name,size(friend) as frendsize from  t_user2;
+----------+------------+
|   name   | frendsize  |
+----------+------------+
| liuyan   | 2          |
| jinlian  | 2          |
+----------+------------+

2.Map

map_keys(字段)  所有key
map_values(字段) 所有value

select map_keys(children),map_values(children) from t_user2;
+------------------------+----------+
|          _c0           |   _c1    |
+------------------------+----------+
| ["liuliu","yanyan"]    | [18,14]  |
| ["jinjin","lianlian"]  | [18,19]  |
+------------------------+----------+
select map_keys(children)[0],map_values(children)[0] from t_user2;
+---------+------+
|   _c0   | _c1  |
+---------+------+
| liuliu  | 18   |
| jinjin  | 18   |
+---------+------+
-- 根据key获取值
select children['liuliu'] from t_user2
+-------+
|  _c0  |
+-------+
| 18    |
| NULL  |
+-------+

3.Struct

select name,address.city,address.street from t_user2;
+----------+----------+---------------+
|   name   |   city   |    street     |
+----------+----------+---------------+
| liuyan   | beijing  | huilong guan  |
| jinlian  | beijing  | chao yang     |
+----------+----------+---------------+

Location指定文件位置

Hive表默认的存储路径是通过hive-site.xml配置文件中hive.metastore.warehouse.dir属性指定的.
默认位置

/user/hive/warehouse

在这里插入图片描述
创建数据库,就会在warehouse下产生一个xx.db的文件夹,在哪个库下创建表,就会在对应的文件夹下产生对应表的文件夹.当然这是默认情况 我们可以在创建表时使用Location来指定表的位置.

create table t_user_location(
    id int,
    uname string,
    pwd string,
    sex string,
    age int )
row format delimited fields terminated by ','
location "/aaa";  -- 这里指定在根目录下的aaa文件夹

将数据上传到aaa文件夹中
hdfs dfs -put user.txt /aaa

Location可以指定创建库的位置 也可以指定创建表的位置.

查询修改删除表

-- 显示表信息
show tables;
show tables like '*user*';

desc t_user;   --字段  类型
desc formatted t_user;  -- 表详细信息

-- 修改表名
-- alter table old_table_name rename to new_table_name
-- alter table test02 rename to test;

--  添加列
-- alter table 表名  add  列名 数据类型;


-- 修改列
-- alter table 表名 change 旧列名 新列名 数据类型



-- 删除列  想删除哪列 就不写哪列 这里的删除就是用 ()中的内容替换原本的内容
select * from t_user_location;
alter  table  t_user_location replace columns (
    id int,
    uname string,
    pwd string,
    sex string);


-- 删除表
-- drop table 表名;

数据的导入

1.直接放到对应目录

创建好一张表后,会有对应的文件夹 默认位置 /user/hive/warehouse/xx.db/表名
我们之前的方式是通过put或者mv直接将文件放入到对应的文件夹下 

user.txt
1,admin,123456,男,18
2,zhangsan,abc123,男,23
3,lisi,654321,女,16

use hive01;

create table t_user_import(
    id int,
    uname string,
    pwd string,
    sex string,
    age int
)row format delimited fields terminated by ',';

我们可以直接将user.txt 上传到指定的位置 
hdfs dfs -put user.txt /user/hive/warehouse/hive01.db/t_user_import
也可以将hdfs上的数据 移动 或者复制到指定的位置
hdfs dfs -mv  /user.txt /user/hive/warehouse/hive01.db/t_user_import
hdfs dfs -cp  /user.txt /user/hive/warehouse/hive01.db/t_user_import

表的文件夹下可以有多个文件 都可以显示

使用load方式

指定LOCAL,将在本地文件系统中查找文件路径。
若指定相对路径,将相对于用户的当前工作目录进行解释;
用户也可以为本地文件指定完整的URI-例如:file:///root/user.txt
/*
语法
     加载本地文件到 表  注意 这里的本地并不是客户端本地 而是hiveserver2所在的计算机
     load data local inpath '本地文件' into table  表名;  //不覆盖原有数据 如果有相同文件会自动改名
     load data local inpath '本地文件' overwrite into table  表名; //覆盖原有数据
    加载hdfs文件到 表
     load data  inpath '本地文件' into table  表名;  //不覆盖原有数据 如果有相同文件会自动改名
     load data  inpath '本地文件' overwrite into table  表名; //覆盖原有数据
 */
create table t_user_load(
    id int,
    uname string,
    pwd string,
    sex string,
    age int
)row format delimited fields terminated by ',';

-- 注意这是一个复制操作 本地的user.txt还存在   
load data local inpath "/root/user.txt" into table t_user_load;
-- 同名文件可以多次执行 会自动改名
load data local inpath "/root/user.txt" into table t_user_load;
-- 查询没有任何问题
select * from t_user_load;

-- 如果加上 overwite 会将原本文件中的所有文件覆盖
load  data local inpath "/root/user.txt" overwrite into table t_user_load;
-- 查询时只显示最后一次添加的内容
select * from t_user_load;

将HDFS文件加载到对应表

没有指定LOCAL关键字 如果filepath指向的是一个完整的URI,会直接使用这个URI 
如果没有指定schema,Hive会使用在hadoop配置文件中参数fs.defaultFS指定的(不出意外,都是HDFS)。

-- 将hdfs上的根目录的user.txt 加载  注意这是一个移动的动作 原本位置的文件没有了
load data  inpath "/user.txt" into table t_user_load;
-- 加上overwirte还是覆盖操作
load data  inpath "/user.txt" overwrite into table t_user_load;
  1. 使用insert+select
    insert+select表示:将后面查询返回的结果作为内容插入到指定表中,注意OVERWRITE将覆盖已有数据。需要保证查询结果列的数目和需要插入数据表格的列数目一致.如果查询出来的数据类型和插入表格对应的列数据类型不一致,将会进行转换,但是不能保证转换一定成功,转换失败的数据将会为NULL。
create table test_insert(
    id int,
    name string
)row format delimited fields terminated by ",";

查询user表的id和name 将结果保存到test_insert中;
insert into table test_insert select id,uname from t_user_load;

查询user表的id和name 将结果保存到test_insert中 将原有数据覆盖
insert overwrite table  test_insert select id,uname from t_user_load;

Multiple Inserts 多重插入 核心:一次扫描,多次插入 目的就是减少扫描的次数 完成多次insert操作.

create table test_insert02(
    id int
)row format delimited fields terminated by ",";

create table test_insert03(
    name string
)row format delimited fields terminated by ",";

我想将user表中id一列插入到  test_insert02 表中 将user表中name一列插入到test_insert03表中.
我们可以这样写

insert into table  test_insert02 select id from t_user;
insert into table  test_insert03 select uname from t_user;
但是这样的话 会扫描t_user两次 

一次扫描,多次插入
from t_user
insert into table test_insert02
select id
insert into table test_insert03
select uname;

数据的导出

insert导出
Hive支持将select查询的结果导出成文件存放在文件系统。注意:导出操作是一个OVERWRITE覆盖操作,慎重。

格式
 -- 将查询的结果 导出到本地文件夹
 insert overwrite local directory '本地文件夹名' select 查询语句;
  -- 将查询的结果 导出HDFS 不写local
 insert overwrite  directory 'HDFS文件夹名' select 查询语句;

导出到本地

-- 将t_user表中的数据 导出到本地文件夹 这是一个覆盖操作 会覆盖指定文件夹下的所有 如果指定为/ 那么废了
insert overwrite local directory '/data/output' select * from t_user;

--以这种方式导出的文件是使用的是默认分隔符 '\001'
--我们可以自己指定分隔符
insert overwrite local directory '/data/output2'
row format delimited fields terminated by ',' 
select * from t_user;

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

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

相关文章

ijkplayer音视频同步

接上篇&#xff1a; ijkplayer框架的集成&#xff08; 从开始到优化秒开&#xff09; 补充&#xff1a; ijkplayer - 拓展&#xff1a; 资料收集备用。 1、在弱网时使用 2、ijkplayer播放卡顿 3、如何支持https链接播放 4、如何降低ijkplayer延迟效应 5、ijkplayer中音…

javaIO流之文件流

目录 简介一、File的构造方法二、File的常用方法1、获取功能的方法2、绝对路径和相对路径3、判断功能的方法4、创建、删除功能的方法5、目录的遍历6、递归遍历 三、RandomAccessFile1、主要方法 四、Apache FileUtils 类1、复制文件或目录&#xff1a;2、删除文件或目录&#x…

提高运算放大器输出功率

运算放大器的串联&#xff1a;如何同时实现高精度和高输出功率 复合放大器 复合放大器由两个单独放大器组合而成&#xff0c;分别具有不同的特性。 图1所示就是这种结构。放大器1为低噪声精密放大器ADA4091-2。 在本例中&#xff0c;放大器2为AD8397,具有高输出功率&#xff…

召回/粗排阶段 负样本常见构造方法

文章目录 1、曝光未点击2、全局随机选择负例3、batch内随机选择负例4、曝光数据随机选择负例5、基于popularity随机选择负例6、基于hard选择负例大佬的总结&#xff1a; 大佬的名言&#xff1a;“如果精排是特征的艺术&#xff0c;那么召回就是样本的艺术&#xff08;负样本为王…

linux 用mv替代rm将文件移动到回收站,避免误操作

有时候在linux上操作rm -rf 删除命令时&#xff0c;不下心就会将不想删除的文件给删除了&#xff0c;删完后&#xff0c;顿时傻眼了&#xff0c;比如 &#xff0c;文件夹test下面有 a ,a1 ,b ,b2四个文件&#xff0c;本来想删除test文件夹下面的a和a1连个文件&#xff0c; 输入…

TCP、UDP原理、DNS协议、CDN原理

1. 如何理解UDP 和 TCP? 区别? 应用场景? 一、UDP UDP&#xff08;User Datagram Protocol&#xff09;&#xff0c;用户数据包协议&#xff0c;是一个简单的面向数据报的通信协议&#xff0c;即对应用层交下来的报文&#xff0c;不合并&#xff0c;不拆分&#xff0c;只是…

Win10搭建Docker Desktop

Win10搭建Docker Desktop 1 介绍 Docker Desktop是适用于Windows的Docker桌面&#xff0c;是Docker设计用于在Windows 10上运行。它是一个本地 Windows 应用程序&#xff0c;为构建、交付和运行dockerized应用程序提供易于使用的开发环境。Docker Desktop for Windows 使用 Wi…

ChatGPT 插件,组合后更妙了

ChatGPT 插件&#xff0c;组合后更妙 大家好&#xff0c;我是章北海mlpy 昨天极简介绍了一些热门的ChatGPT插件 我测试了一些组合玩法&#xff0c;感觉效率、效果都远超预期。 今天就演示一下如何利用多个插件&#xff0c;高速阅读、理解一篇论文。 备注&#xff1a;一个C…

HTB靶机013-Poison-WP

013-Poison 靶机IP&#xff1a; 10.10.10.84 Scan Nmap 快速扫描&#xff1a; ┌──(xavier㉿kali)-[~] └─$ sudo nmap -sSV -T4 10.10.10.84 -F Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-30 16:41 CST Nmap scan report for 10.10.10.84 Host is up (0.27s…

公牛车充拆解 | 拓尔微A+C双口快充方案IM2403+TMI3451

在快节奏的生活中&#xff0c;手机已成为人们不可或缺的工具。对于经常开车出门的人来说&#xff0c;在车上给手机充电已经成为刚需&#xff0c;因此车载充电器是很多车主的不二之选&#xff0c;它能便捷地解决手机在车内充电的问题&#xff0c;让车主在开车途中保持电量充足。…

MySQL高级_第10章_索引优化与查询优化

MySQL高级_第10章_索引优化与查询优化 1. 数据准备 学员表 插 50 万 条&#xff0c; 班级表 插 1 万 条。 步骤 1 &#xff1a;建表 CREATE TABLE class ( id INT ( 11 ) NOT NULL AUTO_INCREMENT , className VARCHAR ( 30 ) DEFAULT NULL , address …

FlinkKafkaProducer 源码分析

initializeState 先查询是否开启isCheckpointingEnabled配置&#xff0c;如果没开&#xff0c;但是使用了EXACTLY_ONCE或者AT_LEAST_ONCE语义&#xff0c;就报错。 然后从checkpoint中保存的state中读取nextTransactionalIdHintState。 NEXT_TRANSACTIONAL_ID_HINT_DESCRIPTOR…

表情、特殊字符、字符串截取

码元与码点 关于码元和和码点&#xff0c;通过一个例子进行介绍。 如图&#xff0c;字符串&#x1f60a;只有一个“笑脸”符号&#xff0c;但是通过length属性发现&#xff0c;“长度”为2&#xff0c;string.length到底表示什么&#xff1f; 答&#xff1a;码元的个数 什么是…

C语言爬取HTML-爬取壁纸 文末附源码

前言&#xff1a;这学期计算机软件课程设计的其中一个题目是使用C语言爬取HTML&#xff0c;本打算使用C语言的CSpidr库来实现&#xff0c;但是因为它的依赖liburi没有找到在哪里安装&#xff0c;所以放弃了这个想法&#xff0c;使用的是curl以及libxml2这两个库&#xff0c;能够…

这几款实用且有趣的软件不容错过

软件一&#xff1a;天若ocr 这款Windows平台的天若OCR文字识别工具一定更适合你。 软件作者来自天若游心&#xff0c;我爱破解。 发布一年半以来一直深受好评&#xff0c;更新速度也非常快。 最近&#xff0c;它增加了批次识别功能。 软件二&#xff1a;腾讯柠檬精简版 除了Q…

P2233 [HNOI2002]公交车路线

题目描述 在长沙城新建的环城公路上一共有 8 个公交站&#xff0c;分别为 A、B、C、D、E、F、G、H。公共汽车只能够在相邻的两个公交站之间运行&#xff0c;因此你从某一个公交站到另外一个公交站往往要换几次车&#xff0c;例如从公交站 A 到公交站 D&#xff0c;你就至少需要…

keycloak介绍与使用示例,超时时间设置

keycloak介绍 Keycloak是一款由Red Hat开源社区开发的开放源代码的身份和访问管理解决方案&#xff0c;它提供了安全的单点登录(SSO)、多因素身份验证、社交登录和基于角色的访问控制等功能Keycloak基于OAuth 2.0和OpenID Connect协议&#xff0c;并支持SAML 2.0&#xff0c;可…

spring Bean的循环依赖问题

public class Husband {private String name;private Wife wife;public void setName(String name) {this.name name;}public String getName() {return name;}public void setWife(Wife wife) {this.wife wife;}// toString()方法重写时需要注意&#xff1a;不能直接输出wif…

【计算机网络基础】章节测试2 物理层

文章目录 判断题选择题辨析题应用题 判断题 现在的无线局域网常用的频段是2.8GHz和5.4GHz。 多模光纤只适合于近距离传输。√ 数据在计算机内部多采用串行传输方式&#xff0c;但在通信线路上多采用并行传输方式。 统计时分复用可以按需动态分配时隙。√ 相对于同步时分复用…

卷麻了,新来的00后实在是太卷了...

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&…