1

我们正在支持一个运行通过 ETL 工具触发的大型配置单元查询的应用程序。

映射后的查询在 hive 上运行。查询非常大,但它的结构看起来像这样。

INSERT INTO Table2
Select t1.f0, t1.f1,
infUDFCallDouble('TO_FLOAT', t1.f2) as f2, 
SUBSTR(SUBSTR(toString(t1.f4, 'YYYY-MM-DD'), (CASE WHEN 0 < (- 
LENGTH(toString(t1.f4, 'YYYY-MM-DD'))) THEN 0 ELSE 0 END), 10), (CASE WHEN 0 < (- LENGTH(SUBSTR(toString(t1.f4, 'YYYY-MM-DD'), (CASE WHEN 0 < (- LENGTH(toString(t1.f4, 'YYYY-MM-DD'))) THEN 0 ELSE 0 END), 10))) THEN 0 ELSE 0 END), 10) as f4, 
f5, .....
FROM
   (
     Select t1.f0, t1.f1...
     FROM
        (
         SELECT CAST(t1.cust_id AS STRING) as f0, ....
          ...
         FROM sw.v_cust_info_pr t1
         )
     group by t1.f0, t1.f1
     .....t1.f50 )
t1 ; 

我当然不认为,他们需要多次扫描同一个视图。有没有更简单的方法来写这个。或者肯定可以合并多个阶段映射,这是我的猜测。除此之外,还有其他更简单的方法可以解决这个问题。我是新来的,在支持方面,但是这个查询运行了几个小时,所以需要检查它是否以正确的方式运行。我确信可以丢弃一个内部选择,我可以尝试其他任何方法。

4

1 回答 1

0

你的问题中像这样的子查询不是问题,优化器会处理这个问题。不会对同一数据进行多次读取。您的查询仅读取一次源:FROM sw.v_cust_info_pr t1. 整个查询将在两个顶点中执行 - Mapper 1 和 Reducer 2。使用explain select来检查这一点。要加快处理速度,请使用 Tez、CBO、矢量化、PPD,在 mapper 和 reducer 上调整适当的并行度。使用地图端聚合set hive.map.aggr = true;

于 2019-03-08T17:09:31.353 回答