基于从源表的一列向目标表插入多列的查询优化
Posted
技术标签:
【中文标题】基于从源表的一列向目标表插入多列的查询优化【英文标题】:Optimizing Query based on Inserting into multiple columns into target table from one column of a source table 【发布时间】:2019-05-23 13:39:18 【问题描述】:我正在尝试根据条件将表的一列中的值插入到另一表的多列中。我已经准备好查询,但它卡在 MapReduce 阶段的 80%
我正在使用 hive 1.1.0。 目前,我在下面设置,在执行查询之前
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.dynamic.partition=true;
set parquet.compression=SNAPPY;
set hive.support.quoted.identifiers=none;
set mapreduce.map.speculative=false;
set mapreduce.reduce.speculative=false;
set hive.mapred.reduce.tasks.speculative.execution=false;
set mapreduce.map.memory.mb=15000;
set mapreduce.map.java.opts=-Xmx2400m;
set mapreduce.reduce.memory.mb=5000;
set mapreduce.reduce.java.opts=-Xmx2400m;
set mapreduce.input.fileinputformat.split.maxsize=1024000000;
set mapreduce.input.fileinputformat.split.minsize=1024000000;
set hive.exec.max.dynamic.partitions.pernode=1000;
请提供建议以在 hive 中完美运行此查询。
select
IDENTIFICADOR_ID,
ESTADO,
FECHA_ESTADO,
MUNICIPIO_ID,
TIPO_ID,
NOMBRE_COMPLETO,
VALOR_PLAN_FACTURACION,
VALOR_ESTADO_SERVICIO,
VALOR_PAQUETE,
VALOR_ACCESP,
VALOR_TIPO_BANDA_ANCHA,
VALOR_VELOCIDAD_ACCESO,
descripcion_ltcar,
DESCRIPCION_PLAN_OPEN,
ESTADO_FNX_PLANES_FACTURACION,
load_date from(
select a.IDENTIFICADOR_ID,
a.ESTADO,
a.FECHA_ESTADO,
a.MUNICIPIO_ID,
b.TIPO_ID,
b.NOMBRE_COMPLETO,
a1.valor as VALOR_PLAN_FACTURACION,
b1.valor as VALOR_ESTADO_SERVICIO,
c1.valor as VALOR_PAQUETE,
d1.valor as VALOR_ACCESP,
e1.valor as VALOR_TIPO_BANDA_ANCHA,
m1.valor as VALOR_VELOCIDAD_ACCESO,
d.descripcion_ltcar,
e.DESCRIPCION_PLAN_OPEN,
e.estado as ESTADO_FNX_PLANES_FACTURACION,
'2019-05-22' as load_date from
db_trusted_common_zone.FNX_IDENTIFICADORES_bs as a,db_trusted_common_zone.FNX_LISTAS_TCARACTERISTICAS_bs d
right join (select valor,IDENTIFICADOR_ID
from db_trusted_common_zone.FNX_CONFIGURACIONES_IDENTIF_bs where caracteristica_id=2005)a1
on a1.IDENTIFICADOR_ID = a.IDENTIFICADOR_ID
right join (select valor,IDENTIFICADOR_ID
from db_trusted_common_zone.FNX_CONFIGURACIONES_IDENTIF_bs where caracteristica_id=132 )b1
on b1.IDENTIFICADOR_ID = a.IDENTIFICADOR_ID
right join (select valor,IDENTIFICADOR_ID
from db_trusted_common_zone.FNX_CONFIGURACIONES_IDENTIF_bs where caracteristica_id=2879)c1
on c1.IDENTIFICADOR_ID = a.IDENTIFICADOR_ID
right join (select valor,IDENTIFICADOR_ID
from db_trusted_common_zone.FNX_CONFIGURACIONES_IDENTIF_bs where caracteristica_id=2093)d1
on d1.IDENTIFICADOR_ID = a.IDENTIFICADOR_ID
right join (select valor,IDENTIFICADOR_ID
from db_trusted_common_zone.FNX_CONFIGURACIONES_IDENTIF_bs where caracteristica_id=120)e1
on e1.IDENTIFICADOR_ID = a.IDENTIFICADOR_ID
right join (select valor,IDENTIFICADOR_ID
from db_trusted_common_zone.FNX_CONFIGURACIONES_IDENTIF_bs where caracteristica_id=33)f1
on f1.IDENTIFICADOR_ID = a.IDENTIFICADOR_ID
right join (select valor,IDENTIFICADOR_ID
from db_trusted_common_zone.FNX_CONFIGURACIONES_IDENTIF_bs where caracteristica_id=4430)g1
on g1.IDENTIFICADOR_ID = a.IDENTIFICADOR_ID
right join (select valor,IDENTIFICADOR_ID
from db_trusted_common_zone.FNX_CONFIGURACIONES_IDENTIF_bs where caracteristica_id=2123)h1
on h1.IDENTIFICADOR_ID = a.IDENTIFICADOR_ID
right join (select valor,IDENTIFICADOR_ID
from db_trusted_common_zone.FNX_CONFIGURACIONES_IDENTIF_bs where caracteristica_id=4389)i1
on i1.IDENTIFICADOR_ID = a.IDENTIFICADOR_ID
right join (select valor,IDENTIFICADOR_ID
from db_trusted_common_zone.FNX_CONFIGURACIONES_IDENTIF_bs where caracteristica_id=201)j1
on j1.IDENTIFICADOR_ID = a.IDENTIFICADOR_ID
right join (select valor,IDENTIFICADOR_ID
from db_trusted_common_zone.FNX_CONFIGURACIONES_IDENTIF_bs where caracteristica_id=4388)k1
on k1.IDENTIFICADOR_ID = a.IDENTIFICADOR_ID
right join (select valor,IDENTIFICADOR_ID
from db_trusted_common_zone.FNX_CONFIGURACIONES_IDENTIF_bs where caracteristica_id=37)l1
on l1.IDENTIFICADOR_ID = a.IDENTIFICADOR_ID
right join (select valor,IDENTIFICADOR_ID
from db_trusted_common_zone.FNX_CONFIGURACIONES_IDENTIF_bs where caracteristica_id=124)m1
on m1.IDENTIFICADOR_ID = a.IDENTIFICADOR_ID
inner join db_trusted_common_zone.FNX_CLIENTES_bs as b
on a.CLIENTE_ID=b.CLIENTE_ID
inner join db_trusted_common_zone.FNX_PLANES_FACTURACION_bs as e
on a.PRODUCTO_ID=e.PRODUCTO_ID
and a.SERVICIO_ID=e.SERVICIO_ID
and a.EMPRESA_ID=e.EMPRESA_ID
and a.MUNICIPIO_ID=e.MUNICIPIO_ID
where a.TIPO_ELEMENTO_ID in ('CUENTA','TELEV','TO')
and d.caracteristica_id=124)t
【问题讨论】:
是否可以优化现有查询而不使用连接? 不,没有连接就无法优化。使用显式连接语法重写。 更新了我的查询 这与以前完全不同。哇 @leftjoin 你能帮忙提供一些修改来调整这个 【参考方案1】:表FNX_CONFIGURACIONES_IDENTIF_bs
只能连接一次,用例语句聚合:
select
IDENTIFICADOR_ID,
ESTADO,
FECHA_ESTADO,
MUNICIPIO_ID,
TIPO_ID,
NOMBRE_COMPLETO,
VALOR_PLAN_FACTURACION,
VALOR_ESTADO_SERVICIO,
VALOR_PAQUETE,
VALOR_ACCESP,
VALOR_TIPO_BANDA_ANCHA,
VALOR_VELOCIDAD_ACCESO,
descripcion_ltcar,
DESCRIPCION_PLAN_OPEN,
ESTADO_FNX_PLANES_FACTURACION,
load_date
from
(
select
a.IDENTIFICADOR_ID,
a.ESTADO,
a.FECHA_ESTADO,
a.MUNICIPIO_ID,
b.TIPO_ID,
b.NOMBRE_COMPLETO,
max(case when caracteristica_id=2005 then c.valor end) as VALOR_PLAN_FACTURACION,
max(case when caracteristica_id=132 then c.valor end) as VALOR_ESTADO_SERVICIO,
max(case when caracteristica_id=2879 then c.valor end) as VALOR_PAQUETE,
max(case when caracteristica_id=2093 then c.valor end) as VALOR_ACCESP,
max(case when caracteristica_id=120 then c.valor end) as VALOR_TIPO_BANDA_ANCHA,
max(case when caracteristica_id=124 then c.valor end) as VALOR_VELOCIDAD_ACCESO,
d.descripcion_ltcar,
e.DESCRIPCION_PLAN_OPEN,
e.estado as ESTADO_FNX_PLANES_FACTURACION,
'2019-05-22' as load_date
from db_trusted_common_zone.FNX_IDENTIFICADORES_bs as a,
db_trusted_common_zone.FNX_LISTAS_TCARACTERISTICAS_bs d --this join needs to be fixed, there is no ON condition. This is CROSS JOIN. It is acceptable if table d returns only one row
inner join (select * from db_trusted_common_zone.FNX_CONFIGURACIONES_IDENTIF_bs c where caracteristica_id in (2005,132,2879,2093,120,124)) c on c.IDENTIFICADOR_ID = a.IDENTIFICADOR_ID --join only one time with this table
inner join db_trusted_common_zone.FNX_CLIENTES_bs as b on a.CLIENTE_ID=b.CLIENTE_ID
inner join db_trusted_common_zone.FNX_PLANES_FACTURACION_bs as e on a.PRODUCTO_ID=e.PRODUCTO_ID
and a.SERVICIO_ID=e.SERVICIO_ID
and a.EMPRESA_ID=e.EMPRESA_ID
and a.MUNICIPIO_ID=e.MUNICIPIO_ID
where a.TIPO_ELEMENTO_ID in ('CUENTA','TELEV','TO')
and d.caracteristica_id=124
group by
a.IDENTIFICADOR_ID,
a.ESTADO,
a.FECHA_ESTADO,
a.MUNICIPIO_ID,
b.TIPO_ID,
b.NOMBRE_COMPLETO,
d.descripcion_ltcar,
e.DESCRIPCION_PLAN_OPEN,
e.estado as ESTADO_FNX_PLANES_FACTURACION
)t
还加入db_trusted_common_zone.FNX_LISTAS_TCARACTERISTICAS_bs
仍然需要修复。它没有 ON 条件,可用作交叉连接。
这些值也太高了:
set mapreduce.input.fileinputformat.split.maxsize=1024000000;
set mapreduce.input.fileinputformat.split.minsize=1024000000;
尽量减少 x2 甚至 x4 倍或更多以增加并行度。
【讨论】:
此外,我可以通过更改连接顺序和使用中间表来调整它。 @Durga 也可以将 this 和 d.caracteristica_id=124 移至加入 ON 条件。但首先你需要修复 CROSS JOIN。似乎缺少 ON 条件以上是关于基于从源表的一列向目标表插入多列的查询优化的主要内容,如果未能解决你的问题,请参考以下文章