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.多列,具有很多列字段,但是查询只会使用一个字段或者很少的一组字段。基于列式存储将会使分析表数据执行的更快。