使用Group By和Like对Impala查询的性能降低

时间:2017-02-10 22:54:20

标签: performance hadoop cloudera impala

我们正在测试Apache Impala,并注意到使用GROUP BY和LIKE一起工作非常缓慢 - 单独的查询工作得更快。以下是两个例子:

mydata<-fread("data.csv", sep="," , header=TRUE)

f <- function(pars, xx) 
   with(pars,(a + b*(tc - xx)^m * (1 + c * cos(omega*log(tc - xx) + phi))))`

resids <- function(p, observed, xx) {mydata$Logp - f(p,xx)}

nls.out <- nls.lm(par=list(a=1,b=-1,tc=100, m=0.5, omega=1, phi=1, c=1 ),
              fn = resids, observed = mydata$Logp, xx = mydata$day,
              control=nls.lm.control(maxiter=10000, ftol=1e-6, maxfev=1e6))
# 1.37s 1.08s 1.35s

SELECT * FROM hive.default.pcopy1B where 
     (lower("by")  like '%part%' and lower("by")  like '%and%' and lower("by")  like '%the%') 
  or (lower(title) like '%part%' and lower(title) like '%and%' and lower(title) like '%the%') 
  or (lower(url)   like '%part%' and lower(url)   like '%and%' and lower(url)   like '%the%') 
  or (lower(text)  like '%part%' and lower(text)  like '%and%' and lower(text)  like '%the%') 
limit 100;

有人可以解释为什么会出现此问题,以及是否有任何变通方法?

1 个答案:

答案 0 :(得分:1)

2个查询之间存在基本差异。

第一次查询

要点:

  • 仅选择了100行。
  • 只要进程获得满足提供的WHERE子句的100行,就会将其标记为已完成,并返回100条记录。
  • 只有1个映射器步骤。映射器的数量取决于您的数据大小。

第二次查询

要点:

  • 仅选择了10行。
  • 即使只选择了10行,该过程也需要扫描完整数据,以便根据GROUP BY子句生成结果。
  • 应该有3个mapper-reducer步骤。每一步的mapper-reducer数量取决于数据大小。
    • 第一个MP将读取数据并应用WHERE子句
    • 第二个MR将用于GROUP BY条款。
    • 第3个MR将用于ORDER BY条款。

因此,您提供的查询可能看起来很相似,但它们完全不同,并且可以解决所有目的。

我希望这会对你有所帮助。