加入收藏 | 设为首页 | 会员中心 | 我要投稿 济宁站长网 (https://www.0537zz.cn/)- 行业智能、边缘计算、专有云、AI硬件、5G!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

Hive 如何快速拉取大批量数据

发布时间:2020-11-07 06:44:50 所属栏目:优化 来源:网络整理
导读:用hive来做数仓类操作,或者大数据的运算,是没有疑问的,至少在你没有更多选择之前。 当我们要hive来做类似于大批量数据的select时,也许问题就会发生了变化。 1. 通用解决方案之分页 首先,我们要基于一个事实,就是没有哪个数据库可以无限制的提供我们s

但是,这个会有什么问题?同样,小数据量时无任何疑问,但当数据量足够大时,每一次的数据接收,都需要一次网络通信请示,且都是单线程的。我们假设接受一条数据花费1ms, 那么接收1000条数就是1s, 6k条数据就是1min。36w条数据就是1h, 额,后面就无需再算了。同样是不可估量的时间消耗。(实际情况也许会好点,因为会有buffer缓冲的存在)

为什么会这样呢?运算量已经减小了,但是这网络通信量,我们又能如何?实际上,问题不在于网络通信问题,而在于我们使用这种方式,使我们从并行计算转到了串行计算的过程了。因为只有单点的数据接收,所以只能将数据汇集处理。从而就是一个串行化的东西了。

所以,我们更多应该从并行这一层面去解决问题。

3. 基于临时表实现

要解决并行变串行的问题,最根本的办法就是避免一条条读取数据。而要避免这个问题,一个很好想到的办法就是使用临时表,绕开自己代码的限制。让大数据集群自行处理并行计算问题,这是个不错的想法。

但具体如何做呢?我们面临至少这么几个问题:

如何将数据写入临时表? 写入临时表的数据如何取回?是否存在瓶颈问题? 临时表后续如何处理?

我们一个个问题来,第1个,如何写临时表问题:我们可以选择先创建一个临时表,然后再使用insert into select ... from ... 的方式写入,但这种方式非常费力,首先你得固化下临时表的数据结构,其次你要处理多次写入问题。看起来不是最好的办法。幸好,hive中或者相关数据库产品都提供了另一种更方便的建临时表的方法: create table xxx as select ... from ... 你只需要使用一个语句就可以将结果写入到临时表了。但需要注意的是,我们创建时,需要指定好我们需要的格式,否则最终结果也许不是我们想要的,比如我们需要使用','分隔数据而非tab, 我们需要使用 text 形式的数据,而非压缩的二进制格式。

以下是个使用样例:

-- 外部使用 create table 包裹 CREATE TABLE tmp_2020110145409001      ROW FORMAT DELIMITED     FIELDS TERMINATED BY ','     STORED AS TEXTFILE as          -- 具体的业务select sql         select t1.*, t2.* from test t1 left join test2 t2 on t1.id = t2.t_id     ; 

如此,我们就得到所需的结果了。以上结果,在hive中表现为一个临时表。而其背后则是一个个切分的文件,以','号分隔的文本文件,且会按照hive的默认存储目录存放。(更多具体语法请查询官网资料)

接下来,我们要解决第2个问题:如何将数据取回?这个问题也不难,首先,现在结果已经有了,我们可以一行行地读取返回,就像前面一样。但这时已经没有了数据运算,应该会好很多。但明显还是不够好,我们仍然需要反复的网络通信。我们知道,hive存储的背后,是一个个切分的文件,如果我们能够将该文件直接下载下来,那将会是非常棒的事。不错,最好的办法就是,直接下载hive的数据文件,hive会存储目录下,以类似于 part_0000, part_0001... 之类的文件存放。

那么,我们如何才能下载到这些文件呢?hive是基于hadoop的,所以,很明显我们要回到这个问题,基于hadoop去获取这些文件。即 hdfs 获取,命令如下:

(编辑:济宁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读