我运行的大多数查询都有这种格式:
SELECT COUNT(*),A.a1 FROM A WHERE A.a2='x' GROUP BY A.a1
A
表是一个包含csv文件的hdfs文件夹。
由于hive
速度非常慢,我如何在map-reduce
中实现此查询?
谢谢
答案 0 :(得分:1)
您的SQL查询可以映射到等效于MapReduce的HelloWorld:WordCount。
我怀疑自定义实现可以比Hive(编译为MapReduce)快得多,但是这里是如何做到的:
(pos, line)
(pos, line)
- > Mapper
:解析/标记化行,提取a1
和a2
,过滤a2='x'
) - > (a1, count=1)
(a1, count)
- > Reducer
:汇总所有count
字段 - > (a1, sum)
(a1, sum)
- >一些OutputFormat Hadoop会自动处理GroupBy
,因为Mapper会将a1
设置为关键字段。
不要忘记将Reducer也设置为Combiner以启用本地预聚合。
如果您正在寻求更快的执行,您应该考虑另一种文件格式(Parquet,ORC)和另一个引擎(Hive-on-Tez,Apache Flink,Apache Spark,甚至是Apache Drill等结构化数据的专用引擎) Impala,Apache Kylin,Presto,...)。最佳选择取决于数据大小,执行时间要求(亚秒,<1分钟......)以及您希望处理的其他用例。