Hive学习---DDL(Data Definition Language)数据定义 (创建数据库、创建表、修改表)

news/2025/1/6 9:40:53 标签: 数据库, hive, 学习

1、DDL(Data Definition Language)数据定义

1.1 数据库(Database)

1.1.1 创建数据库

1、语法

CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];

2、案例
(1)创建一个数据库,不指定路径

create database db_hive1;

注意:若是不指定路径,其默认路径为${hive.metastore.warehouse.dir}/database_name.db
(2)创建一个数据库,指定路径

create database db_hive2 location '/db_hive2';

(3)创建一个数据库,带有dbproperties

create database db_hive3 with dbproperties('create_date'='2022-11-18');
1.1.2 查询数据库

1、展示所有数据库
(1)语法

SHOW DATABASES [LIKE 'identifier_with_wildcards'];

注意:like通配表达式说明:*表示任意个任意字符,|表示或的关系
(2)案例

 show databases like 'db_hive*';

2、查看数据库信息
(1)语法

DESCRIBE DATABASE [EXTENDED] db_name;

(2)案例

  • 查看基本信息
desc database db_hive3;
  • 查看更多信息
desc database extended db_hive3
1.1.3 修改数据库

用户可以使用alter database命令修改数据库某些信息,其中能够修改的信息包括dbproperties、location、owner user。需要注意的是:修改数据库location,不会改变当前已有表的路径信息,而只是改变后续创建的新表的默认的父目录。
1、语法

--修改dbproperties
ALTER DATABASE database_name SET DBPROPERTIES (property_name=property_value, ...);

--修改location
ALTER DATABASE database_name SET LOCATION hdfs_path;

--修改owner user
ALTER DATABASE database_name SET OWNER USER user_name;
1.1.4 删除数据库

1、语法

DROP DATABASE [IF EXISTS] database_name [RESTRICT|CASCADE];

注:RESTRICT:严格模式,若数据库不为空,则会删除失败,默认为该模式。 CASCADE:级联模式,若数据库不为空,则会将库中的表一并删除。
2、案例
(1)删除空数据库

drop database db_hive2;

(2)删除非空数据库

drop database db_hive3 cascade;
1.1.5 切换当前数据库
USE database_name;

1.2 表(table)

1.2.1 创建表

1、语法

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]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 row_format] 
[STORED AS file_format]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]

2、关键字说明

  • TEMPORARY
    • 临时表,该表只在当前会话可见,会话结束,表会被删除。
  • EXTERNAL(重点)
    • 外部表,与之相对应的是内部表(管理表)。管理表意味着Hive会完全接管该表,包括元数据和HDFS中的数据。而外部表则意味着Hive只接管元数据,而不完全接管HDFS中的数据。
  • data_type(重点)
    • Hive中的字段类型可分为基本数据类型和复杂数据类型。
      基本数据类型如下:
Hive说明定义
tinyint1byte有符号整数
smallint2byte有符号整数
int4byte有符号整数
bigint8byte有符号整数
boolean布尔类型
float单精度浮点型
double双精度浮点型
decimal十进制精准数字类型decima(16,2)
varchar字符序列,需指定最大长度,最大长度的范围是[1,65535]varchar(32)
string字符串,无需指定最大长度
timestamp时间类型
binary二级制数据

复杂数据类型如下:

类型说明定义取值
array数组是一组相同类型的值的集合arrayarr[0]
mapmap是一组相同类型的键-值对组合map<string,int>map[‘key’]
struct结构体由多个属性组成,每个属性都有自己的属性名和数据类型structid:int,name:stringstruct.id

注:类型转化
Hive的基本数据类型可以做类型转换,转换的方式包括隐式转换和显示转换

方式1:隐式转换
具体规则如下:
a、任何整数类型都可以隐式地转换为一个范围更广的类型,如tinyint可以转换为int,int可以转换为bigint。
b、所有整数类型、float和string类型都可以转换为double
c、tinyint、smallint、int都可以转换为float
d、boolean类型不可以转换为其它类型

方式2:显示转换
可以借助cast函数完成显示的类型转换
a、语法

cast(expr as <type>) 
  • PARTITIONED BY(重点)
    • 创建分区表
  • CLUSTERED BY … SORTED BY…INTO … BUCKETS(重点)
    • 创建分桶表
  • ROW FORMAT(重点)
    • 指定SERDE,SERD。E是serializer and deserializer的简写。Hive使用Serde序列化和反序列哈每行数据。语法说明如下:
      语法一:DELIMITED关键字表示对文件中的每个字段按照特定分割符进行分割,其会使用默认的SERDE对每行数据进行序列化和反序列化。
ROW FORAMT DELIMITED 
[FIELDS TERMINATED BY char] 
[COLLECTION ITEMS TERMINATED BY char] 
[MAP KEYS TERMINATED BY char] 
[LINES TERMINATED BY char] 
[NULL DEFINED AS char]

注:
fields terminated by :列分隔符
collection items terminated by:map、struct和array中每个元素之间的分隔符
map keys terminated by:mao中的key和value的分割符
lines terminated by:行分隔符

语法二:SERDE关键字可用于指定其他内置的SERDE或者用户自定义的SERDE。例如JSON SERDE,可用于处理JSON字符串。

ROW FORMAT SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value,property_name=property_value, ...)] 
  • STORED AS(重点)
    • 指定文件格式,常用的文件格式有,textfile(默认值),sequence file,orc file、parquet file等等。
  • LOCATION
    - 指定表所对应的HDFS路径,若不指定路径,其默认值为
    ${hive.metastore.warehouse.dir}/db_name.db/table_name
  • TBLPROPERTIES

3、Create Table As Select(CTAS)建表
该语法允许用户利用select查询语句返回的结果,直接建表,表的结构和查询语句的结构保持一致,且保证包含select查询语句放回的内容。

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name 
[COMMENT table_comment] 
[ROW FORMAT row_format] 
[STORED AS file_format] 
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement]

4、Create Table Like语法
该语法允许用户复刻一张已经存在的表结构,与上述的CTAS语法不同,该语法创建出来的表中不包含数据。

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
[LIKE exist_table_name]
[ROW FORMAT row_format] 
[STORED AS file_format] 
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
1.2.2 案例

1、内部表与外部表
(1)内部表
Hive中默认创建的表都是的内部表,有时也被称为管理表。对于内部表,Hive会完全管理表的元数据和数据文件。

create table if not exists student(
    id int, 
    name string
)
row format delimited fields terminated by '\t'
location '/user/hive/warehouse/student';
准备其需要的文件如下,注意字段之间的分隔符。
1001	student1
1002	student2
1003	student3
1004	student4
1005	student5
1006	student6
1007	student7
1008	student8
1009	student9
1010	student10
1011	student11
1012	student12
1013	student13
1014	student14
1015	student15
1016	student16

上传文件到Hive指定的路径

hadoop fs -put student.txt /user/hive/warehouse/student

删除表,观察HDFS中的数据文件是否还在

(2)外部表
外部表通常可用于处理其他工具上传的数据文件,对于外部表,Hive只负责管理元数据,不负责管理HDFS中的数据文件。

create external table if not exists student(
    id int, 
    name string
)
row format delimited fields terminated by '\t'
location '/user/hive/warehouse/student';

上传文件到Hive表指定的路径

hadoop fs -put student.txt /user/hive/warehouse/student

删除表,观察HDFS中的数据文件是否还在(肯定还在)

2、Serde和复杂数据类型
若现有如下格式的JSON文件需要由Hive进行分析处理,请考虑如何设计表?
注:以下内容为格式化之后的结果,文件中每行数据为一个完整的JSON字符串。

{
    "name": "dasongsong",
    "friends": [
        "bingbing",
        "lili"
    ],
    "students": {
        "xiaohaihai": 18,
        "xiaoyangyang": 16
    },
    "address": {
        "street": "hui long guan",
        "city": "beijing",
        "postal_code": 10010
    }
}

最终设置的表结构

create table teacher
(
    name     string,
    friends  array<string>,
    students map<string,int>,
    address  struct<city:string,street:string,postal_code:int>
)
row format serde 'org.apache.hadoop.hive.serde2.JsonSerDe'
location '/user/hive/warehouse/teacher';

上传文件到Hive表指定的路径

 hadoop fs -put teacher.txt /user/hive/warehouse/teacher

尝试从复杂数据类型的字段中取值

3、create table as select和create table like

1.2.3 查看表

1、展示所有表
(1)语法

SHOW TABLES [IN database_name] LIKE ['identifier_with_wildcards'];

注:like通配表达式说明:*表示任意个任意字符,|表示或的关系。

2、查看表信息
(1)语法

DESCRIBE [EXTENDED | FORMATTED] [db_name.]table_name

注:EXTENDED:展示详细信息。FORMATTED:对详细信息进行格式化的展示。

1.2.4 修改表

1、重命名表

ALTER TABLE table_name RENAME TO new_table_name

2、修改列信息
(1)增加列

#该语句允许用户增加新的列,新增列的位置位于末尾。
ALTER TABLE table_name ADD COLUMNS (col_name data_type [COMMENT col_comment], ...)

(2)更新列

#该语句允许用户修改指定列的列名、数据类型、注释信息以及在表中的位置。
ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]

(3)替换列

#该语句允许用户用新的列集替换表中原有的全部列。
ALTER TABLE table_name REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
1.2.5 删除表
DROP TABLE [IF EXISTS] table_name;
1.2.6 清空表
#注意:truncate只能清空管理表,不能删除外部表中数据。
TRUNCATE [TABLE] table_name

http://www.niftyadmin.cn/n/378646.html

相关文章

用arcgis for javascript 开发一个三维地图(入门案例)

效果如图&#xff1a; 详细的步骤就不啰嗦介绍了&#xff0c;大家可以参考上一篇文章二维地图入门案例&#xff0c;这里只是改了一点引用和属性而已。 核心代码&#xff1a; SceneView 用于创建三维地图 require([“esri/Map”, “esri/views/SceneView”] 这里提一句有两种…

体验管理|如何快速低成本开始体验相关的数字化工作‼️

Guofu 第 95⭐️ 篇原创文章分享 &#xff08;点击&#x1f446;&#x1f3fb;上方卡片关注我&#xff0c;加⭐️星标⭐️~&#xff09; &#x1f68f; 写在前面 在体验经济时代&#xff0c;传统企业在应对新需求、新挑战的时候&#xff0c;也需要用新的方式进行企业升级和转型…

Android工程师们,还在纠结要不要转Kotlin?

概述 Kotlin是运行在JVM上的一门新兴语言&#xff0c;它的年龄只有十来岁&#xff0c;2017年&#xff0c;google 官方推荐使用kotlin作为android开发首选语言&#xff0c;至此已逾5年&#xff0c;这5年kotlin借助android的东风迅速发展&#xff0c;可谓一日千里&#xff0c;目…

INFP型人格适合选择哪些专业?

INFP型人格是一种充满同情心、理解力、创造力、想象力和敏感的人格类型。他们通常是理想主义者&#xff0c;注重自我表达和探索&#xff0c;以及对自己和他人的深入思考。 根据INFP的人格特征来分析&#xff0c;INFP型人格在选择专业时通常更偏向于人文、艺术、社会科学和心理…

flv.js接口介绍

flvjs.createPlayer 方法可以传入多个配置参数&#xff0c;下面是官方文档中的全部可用配置参数&#xff1a; {// flv mp4 hlstype: flv,// 是否启用 worker&#xff0c;开启后会使用 web worker 解析数据&#xff0c;提高性能enableWorker: false,// 是否为直播流isLive: fal…

库的制作与使用

什么是库 库是一种可执行的二进制文件&#xff0c;是编译好的代码。使用库可以提高开发效率。在 Linux 下有静态库和动 态库。因此编译出来的体积就比较大。 静态库在程序编译的时候会被链接到目标代码里面。所以程序在运行的时候不再需要静态库了。因此 编译出来的体积就比较大…

代码随想录算法训练营第57天 | 647、516

647. 回文子串 题目描述 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成…

PACS影像解决方案

现代医学影像技术的迅猛发展&#xff0c;使得PACS系统已逐渐成为各级医院实现信息化建设的重要组成部分。医学影像技术的进步也提升了医学影像的清晰度&#xff0c;推动二维PACS向三维升级转变。这一切都使得医学影像数据量激增&#xff0c;加之医疗行业法规的数据保存要求&…