建表时带有external关键字为外部表,否则为内部表
内部表和外部表建表时都可以⾃⼰指定location
删除表时,外部表不会删除对应的数据,只会删除元数据信息,内部表则会删除
其他⽤法是⼀样的
order by:order by 是要对输出的结果进⾏全局排序,这就意味着只有⼀个reducer才能实现(多个reducer⽆法保证全局有序)但是当数据量过⼤的时候,效率就很低。如果在严格模式下(hive.mapred.mode=strict),则必须配合limit使⽤
sort by:sort by 不是全局排序,只是在进⼊到reducer之前完成排序,只保证了每个reducer中数据按照指定字段的有序性,是局部排序。配置mapred.reduce.tasks=nums可以对输出的数据执⾏归并排序。可以配合limit使⽤,提⾼性能
distribute by:distribute by 指的是按照指定的字段划分到不同的输出reduce⽂件中,和sort by⼀起使⽤时需要注意, distribute by必须放在前⾯
cluster by:cluster by 可以看做是⼀个特殊的distribute by+sort by,它具备⼆者的功能,但是只能实现倒序排序的⽅式,不能指定排序规则为asc 或者desc
在⼩表和⼤表进⾏join时,将⼩表放在前边,效率会⾼,hive会将⼩表进⾏缓存
Hive中除了⽀持和传统数据库中⼀样的内关联(JOIN)、左关联(LEFT JOIN)、右关联(RIGHT JOIN)、全关联(FULL JOIN),还⽀持左半关联(LEFT SEMI JOIN)
主要分为6个阶段:
在Hive中,⽤户可以⾃定义⼀些函数,⽤于扩展HiveQL的功能,⽽这类函数叫做UDF(⽤户⾃定义函数)。UDF分为两⼤类:UDAF(⽤户⾃定义聚合函数)和UDTF(⽤户⾃定义表⽣成函数)。
Hive有两个不同的接⼝编写UDF程序。⼀个是基础的UDF接⼝,⼀个是复杂的GenericUDF接⼝。
对表内数据的增删查改是可以正常进⾏的,因为hbase client 访问数据只需要通过 zookeeper 来找到 rowkey 的具体 region 位置即可。
但是对于创建表/删除表等的操作就⽆法进⾏了,因为这时候是需要HMaster介⼊,并且region的拆分、合并、迁移等操作也都⽆法进⾏了。
Impala是基于Hive的⼤数据实时分析查询引擎,直接使⽤Hive的元数据库Metadata,意味着impala元数据都存储在Hive的metastore中。并且impala兼容Hive的sql解析,实现了Hive的SQL语义的⼦集,功能还在不断的完善 中。
1、没有使⽤ MapReduce进⾏并⾏计算,虽然MapReduce是⾮常好的并⾏计算框架,但它更多的⾯向批处理模式,⽽不是⾯向交互式的SQL执⾏。与MapReduce相⽐:Impala把整个查询分成⼀执⾏计划树,⽽不是⼀连串的MapReduce任务,在分发执⾏计划后,Impala使⽤拉式获取 数据的⽅式获取结果,把结果数据组成按执⾏树流式传递汇集,减少的了把中间结果写⼊磁盘的步骤,再从磁盘读取数据的开销。Impala使⽤服务的⽅式避免每次执⾏查询都需要启动的开销,即相⽐Hive没了MapReduce启动时间。
2、使⽤LLVM产⽣运⾏代码,针对特定查询⽣成特定代码,同时使⽤Inline的⽅式减少函数调⽤的开销,加快执⾏效率。
3、充分利⽤可⽤的硬件指令(SSE4.2)。
4、更好的IO调度,Impala知道数据块所在的磁盘位置能够更好的利⽤多磁盘的优势,同时Impala⽀持直接数据块读取和本地代码计算checksum。
5、通过选择合适的数据存储格式可以得到最好的性能(Impala⽀持多种存储格式)。
6、最⼤使⽤内存,中间结果不写磁盘,及时通过⽹络以stream的⽅式传递。
本文为从大数据到人工智能博主「xiaozhch5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。