
删除表就跟SQL标准一样,DROP TABLE xxx,不过要注意是否是内部表导致数据文件也被删除
用的比较多的是:int、double、String、timestamp、date
用的比较多的是:array、map
可以从int转double,void转boolean,总之不能让精度丢失
describe formatted 库.表
或
desc formatted 库.表
通过观察结构可以看出Hive的describe指令是通过如下图的方式进行区分的
其中包含了所有的表信息,包括但不限于:列、分区分桶、owner、创建及更新时间、location
其中比较重要的几个是:
Table Type: 内部表or外部表SerDe Library: SerDe方式InputFormat和OutputFormat:通常与SerDe一致,不一致可能出现序列化、反序列化的错误location:存储在HDFS上的路径内部表:Internal Table、也叫托管表Managed Table,删除内部表会导致HDFS上对应文件也被删除
外部表:建表时指定EXTERNAL,实际生产中可以配合 指定location达到更安全的效果
SerDe分别对应
对象 指:表中的行
STORED AS xxxx,此时的InputFormat和OutputFormat则都与SerDe一致一般来说最常用的就是ORC和默认的LazySimpleSerDe
这个SerDe类主要是用于处理text文本文件,我们可以通过如下ddl案例看出,我们可以在文本文档中通过符号来界定元素

列存储,列式存储比起传统的行式存储更适合批量OLAP查询
当我们建表时使用:
CREATE TABLE IF NOT EXISTS xxxx(
xxxx
)
STORED AS ORC;
那么就可以通过desc formatted xx表看到

load data [local] inpath ‘路径’ into 表名 partition( partition1 = ‘分区值’, partition2 = ‘分区值’)
#是否开启动态分区功能
set hive.exec.dynamic.partition=true;
#指定动态分区模式,分为nonstick非严格模式和strict严格模式。
#strict严格模式要求至少有一个分区为静态分区。
set hive.exec.dynamic.partition.mode=nonstrict;

这是我在工作中遇到的一个场景:
ios表、android表都是按day分区的,我们把其中的某两个字段加载到一个新表中
为了防止同一day的数据ios和android互相覆盖(基于业务特性原因,在5.3.1中详细说明),建表时额外对source进行分区
PARTITIONED BY ( source_partition STRING, day_partition STRING)
加载数据时,source_partition要么选ios要么选android,那么就可以直接写死,而day_partition仍然动态分区
set hive.mapred.mode=nonstrict; --允许全分区字段动态,这里写strict也没事
set hive.exec.dynamic.partition=true; --动态插入分区表
WITH android as( --内存表中有两个字段
SELECT aaaaaa,day FROM ....
)
--OVERWRITE覆盖原有文件,保证中途传的正常。
--按source和day分区
INSERT OVERWRITE TABLE xxx PARTITION(source_partition = 'android', day_partition)
SELECT aaaaa, day , day FROM android
--多查一遍day字段,会自动映射(因为只有一个动态分区了)
insert into:在原文件上追加写insert overwrite:先删除原文件,再新建文件当SELECT … WHERE 分区字段 = xxxx时,可以避免全表扫描
同时像5.3.1对于分区的用法也可以实现业务上的一些幂等操作

这个用的没有分区表多,因为分区表已经能满足绝大部分场景了。
当且仅当每个分区的数据量都还是很大(十亿级别)、同时也能按逻辑再细划分(如:按省分区,按市分桶)
经典的hash取模算法
