加速对字符串值的配置单元连接

igetnqfo  于 2021-06-01  发布在  Hadoop
关注(0)|答案(2)|浏览(357)

我正在配置单元中运行下面的代码,试图连接字段“word”上的两个表。这需要很长时间,我想知道我能做些什么来加速它。在一个表中,“word”字段混合了大写和小写字母,而在另一个表中则全部是大写字母。

Code:

set hive.exec.compress.output=false;
set hive.mapred.mode=nonstrict;

DROP TABLE IF EXISTS newTable;
CREATE TABLE newTable AS
SELECT
      bh.inkey,
      bh.prid,
      bh.hname,
      bh.ptype,
      bh.band,
      bh.sles,
      bh.num_ducts,
      urg.R_NM

from table1 AS bh
INNER JOIN table2 AS urg
    ON LOWER(bh.word)=LOWER(urg.word);
ddrv8njm

ddrv8njm1#

我会在table1的基础上创建一个temp表,单词是大写的。然后不使用任何字符串函数将这个表连接到table2,因为table2.word都是大写的。除了表1和表2一样大之外,字符串函数lower也会导致查询的缓慢。

DROP TABLE IF EXISTS tmpTable;
CREATE TABLE tmpTable AS
SELECT bh.word,
      bh.inkey,
      bh.prid,
      bh.hname,
      bh.ptype,
      bh.band,
      bh.sles,
      bh.num_ducts
from table1 AS bh;

DROP TABLE IF EXISTS newTable;
CREATE TABLE newTable AS
SELECT
      tmp.inkey,
      tmp.prid,
      tmp.hname,
      tmp.ptype,
      tmp.band,
      tmp.sles,
      tmp.num_ducts,
      urg.R_NM
from tmpTable AS tmp
INNER JOIN table2 AS urg
    ON tmp.word=urg.word;
oprakyz7

oprakyz72#

我曾经遇到过一个问题,我的连接条件太复杂,而hive最终只使用了一个reducer来计算它。这里可能是一样的,因为 LOWER 转变。你能检查一下Hive使用了多少减速器吗?
你可以用cte来做 LOWER 作为前一步,并有一个简单的连接条件:

CREATE TABLE newTable AS
with 
    table1_lower as (SELECT *, lower(word) as lword from table1),
    table2_lower as (SELECT *, lower(word) as lword from table2)
select
    bh.inkey,
    bh.prid,
    bh.hname,
    bh.ptype,
    bh.band,
    bh.sles,
    bh.num_ducts,
    urg.R_NM
from table1_lower AS bh
INNER JOIN table2_lower AS urg
    ON bh.lword=urg.lword;

相关问题