在map-reduce中等效的SQL组

时间:2015-05-02 06:50:04

标签: sql hadoop mapreduce hive

我运行的大多数查询都有这种格式:

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

A表是一个包含csv文件的hdfs文件夹。

由于hive速度非常慢,我如何在map-reduce中实现此查询?

谢谢

1 个答案:

答案 0 :(得分:1)

您的SQL查询可以映射到等效于MapReduce的HelloWorld:WordCount。

我怀疑自定义实现可以比Hive(编译为MapReduce)快得多,但是这里是如何做到的:

  • TextInputFormat - > (pos, line)
  • (pos, line) - > Mapper:解析/标记化行,提取a1a2,过滤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分钟......)以及您希望处理的其他用例。