① Hive学习笔记四:HiveSQL之DDL
本文主要介绍HiveSQL中的数据定义语言(DDL)相关概念,包括创建、修改和删除数据库对象的方法。HiveSQL的DDL核心语法主要包括create、alter和drop。
在Hive中,我们可以通过DDL来创建和管理表。表的创建语法通常包含字段定义和表的存储格式。Hive支持多种数据类型,包括原生数据类型(数值、时间日期、字符串、杂项数据类型)和复杂数据类型(数组、映射、结构体、联合类型)。
需要注意的是,Hive支持java数据类型,但在类型不一致时可能会进行隐式转换,但这种转换并非总是成功。此外,Hive提供了一个cast函数用于显式转换数据类型,转换失败时会返回null。
在Hive中,文件读写机制依赖于SerDe(序列化器和反序列化器)类。SerDe用于对象和字节码之间的转换,支持使用默认的LazySimpleSerDe类或指定其他SerDe类,甚至允许用户自定义SerDe类。Hive的row format语法用于指定使用的SerDe类以及分隔符。
Hive默认的存储路径可以通过配置文件hive-site.xml中的属性hive.metastore.warehouse.dir来设置。同时,也可以通过location语法更改数据在HDFS上的存储路径。
关于表的创建,常见的实践包括使用基础数据类型创建表并上传数据,使用复杂数据类型创建表以及指定默认分隔符。此外,还可以通过location语法指定数据存储路径。
Hive中的表有两种类型:内部表和外部表。内部表由Hive管理,创建时默认为内部表。内部表的删除会删除数据及表的元数据。外部表的数据不是Hive管理的,只管理表的元数据。删除外部表只会删除元数据,数据依然存在。外部表结合location语法可以保证数据安全性。
Hive支持分区表和分桶表以优化查询性能。分区表允许根据特定字段将数据划分到不同的分区,可以是静态分区或动态分区。多重分区表则在原有分区的基础上继续分区,形成递进关系。动态分区的字段值基于查询结果自动推断。分桶表则依据分桶字段对数据进行分组,有利于减少全表扫描。
Hive的事务表特性允许在处理数据时获得一致的数据视图,避免了过多的小文件生成。但事务表仅支持特定条件,并且有其局限性,如不支持回滚操作和仅支持ORC格式。使用事务表时,表参数transactional必须为true,并且表只能是分桶表。
视图在Hive中被定义为一种虚拟表,不存储实际数据,只保存查询定义。视图可以简化操作,保护数据隐私,并优化查询复杂度。在Hive3.0版本中,引入了物化视图,用于预计算并保存表连接或聚集等耗时操作的结果,以提高查询性能。
数据库DDL操作涉及到对数据库结构的创建、修改和删除。除了表的DDL操作,Hive还提供了元数据检查功能,通过msck(metastore check)命令来修复元数据问题。数据库DDL操作是数据库管理的基础,对数据存储和查询性能有着重要影响。
② java 验证字符串是否为sql语句 并且是否包含 select 关键字
java验证字符串是否为sql语句,是否包含select关键字,主要使用的是正则表达式来进行验证,如下:
importjava.util.*;
importjava.text.*;
classsqltest
{
publicstaticvoidmain(String[]args)
{
Stringspan="selectaaaa.idname,hello,typet,hfromdatasaaaa,citybwherea.id=b.idandclike'e%'andnameisnull";
span=span.toUpperCase();//测试用sql语句
System.out.println(span);
Stringcolumn="(\w+\s*(\w+\s*){0,1})";//一列的正则表达式匹配如proctp
Stringcolumns=column+"(,\s*"+column+")*";//多列正则表达式匹配如proctp,categoryc,warehousew
Stringownerenable="((\w+\.){0,1}\w+\s*(\w+\s*){0,1})";//一列的正则表达式匹配如a.proctp
Stringownerenables=ownerenable+"(,\s*"+ownerenable+")*";//多列正则表达式匹配如a.proctp,a.categoryc,b.warehousew
Stringfrom="FROM\s+"+columns;
Stringcondition="(\w+\.){0,1}\w+\s*(=|LIKE|IS)\s*'?(\w+\.){0,1}[\w%]+'?";//条件的正则表达式匹配如a=b或aisb..
Stringconditions=condition+"(\s+(AND|OR)\s*"+condition+"\s*)*";//多个条件匹配如a=bandclike'r%'ordisnull
Stringwhere="(WHERE\s+"+conditions+"){0,1}";
Stringpattern="SELECT\s+(\*|"+ownerenables+"\s+"+from+")\s+"+where+"\s*";//匹配最终sql的正则表达式
System.out.println(pattern);//输出正则表达式
System.out.println(span.matches(pattern));//是否比配
}
}