sql在map-reduce中的等价分组

2cmtqfgy  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(309)

我运行的大多数查询都有以下格式:

SELECT COUNT(*),A.a1 FROM A WHERE A.a2='x' GROUP BY A.a1

以及 A 表是一个包含csv文件的hdfs文件夹。
hive 速度慢得离谱,如何在中实现此查询 map-reduce ?
谢谢

myzjeezk

myzjeezk1#

也许下面的步骤能让你对此有所了解,
来自mapper,
用逗号分隔符分隔行
检查a2=x并确认
将a1作为键,int 1作为值
从减速器,
迭代给定键的所有值
把钥匙的所有1加起来
循环之后,将相同的key对象重用为key,sum作为value。
请阅读DonaldMiner的mapreduce设计模式书中的摘要模式。

6jygbczu

6jygbczu2#

您的sql查询可以Map到与mapreduce:wordcount等价的helloworld。
我怀疑定制实现比hive(编译为mapreduce)快得多,但下面是如何做到这一点:
文本输入格式->
(pos, line) (pos, line) -> Mapper :解析/标记行,提取 a1 以及 a2 ,过滤器打开 a2='x' ) ->
(a1, count=1) (a1, count) -> Reducer :全部求和 count 字段->
(a1, sum) (a1, sum) ->一些输出格式
hadoop将自动处理 GroupBy 因为Map器设置 a1 作为关键字段。
别忘了将reducer也设置为combiner,以启用本地预聚合。
如果您希望更快地执行,那么应该考虑另一种文件格式(parquet、orc)和另一个引擎(tez上的hive、apache flink、apache spark,甚至是针对结构化数据的专用引擎,如apache drill、impala、apache kylin、presto等等)。最佳选择取决于数据的大小、执行时间要求(小于1秒,<1min,…)以及您希望处理的其他用例类型。

ui7jx7zq

ui7jx7zq3#

你可以用hadoop流媒体代替hive,
但我不能保证会快得多

hadoop jar hadoop-streaming-*.jar -D -jobconf stream.non.zero.exit.is.failure=false –mapper ‘grep {p}’ –reducer ’wc -l’ –input {d} –output tmp
hadoop fs -getmerge tmp {d}
hadoop fs –rmr tmp

替换 {d} 输入目录,然后 {p} 有一个正则表达式的模式,符合你的条件

相关问题