HiveQL:模式设计

1.关于分区

1.HDFS用于设计存储数百万的大文件,而非数十亿的小文件,如果分区过多,会创建大量的小文件,最终会超出NameNode的处理能力。因为NameNode必须要将所有的系统文件的元数据信息保存到内存中。每个文件的元数据大小为150字节,但是会限制HDFS实例所能管理文件总数的上限。
2.默认情况下,每个task都是一个新的JVM的实例,都需要开启和销毁的开销。对于小文件,每个文件都会对应一个task,在一些情况下,JVM开启和销毁时间中销毁时间可能比实际处理数据的时间还要长。
3.因此,一个理想的分区方案不应该是导致产生太多的分区和文件夹目录,并且每个目录的文件应该足够大,是文件系统中块大小的若干倍。

2.同一份数据多种处理

1.hive本身提供了一个独特的语法,它可以从一个数据源产生多个数据聚合,而无需每次聚合都扫描一次
FROM history
INSERT OVERWRITE sales SELECT *  WHERE action = 'purchased'
INSERT OVERWRITE credits SELECT *  WHERE action = 'returned'

3.分桶表数据存储

--

4.为表增加列

-- 1.Hive提供了SerDe抽象,其用于输入中提取数据,也同样用于输出数据。一个SerDe通常是从左到右进行解析的。通过指定的分隔符分解成列。
-- 2.hive表可以坐在底层数据增加一个字段,但是只能在末尾增加,无法在已有字段的开始或者中间增加字段

5.使用列式存储表

-- 1.没有足够行,一些列中会有很多重复数据,建议列式存储。
-- 2.多列,具有很多列字段,但是查询只会使用一个字段或者很少的一组字段。基于列式存储将会使分析表数据执行的更快。

 

posted @ 2019-08-21 20:44  行走的灵魂  阅读(170)  评论(0编辑  收藏  举报