我运行的大多数查询都有以下格式:
SELECT COUNT(*),A.a1 FROM A WHERE A.a2='x' GROUP BY A.a1
以及 A 表是一个包含csv文件的hdfs文件夹。自 hive 速度慢得离谱,如何在中实现此查询 map-reduce ?谢谢
A
hive
map-reduce
myzjeezk1#
也许下面的步骤能让你对此有所了解,来自mapper,用逗号分隔符分隔行检查a2=x并确认将a1作为键,int 1作为值从减速器,迭代给定键的所有值把钥匙的所有1加起来循环之后,将相同的key对象重用为key,sum作为value。请阅读DonaldMiner的mapreduce设计模式书中的摘要模式。
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,…)以及您希望处理的其他用例类型。
(pos, line)
Mapper
a1
a2
a2='x'
(a1, count)
Reducer
count
(a1, sum)
GroupBy
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} 有一个正则表达式的模式,符合你的条件
{d}
{p}
3条答案
按热度按时间myzjeezk1#
也许下面的步骤能让你对此有所了解,
来自mapper,
用逗号分隔符分隔行
检查a2=x并确认
将a1作为键,int 1作为值
从减速器,
迭代给定键的所有值
把钥匙的所有1加起来
循环之后,将相同的key对象重用为key,sum作为value。
请阅读DonaldMiner的mapreduce设计模式书中的摘要模式。
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,…)以及您希望处理的其他用例类型。
ui7jx7zq3#
你可以用hadoop流媒体代替hive,
但我不能保证会快得多
替换
{d}
输入目录,然后{p}
有一个正则表达式的模式,符合你的条件