Notas de rutina de SQL Sao

1. Pase la sentencia de juicio en la función estadística

Anida la sentencia if en la función count (), si se cumple la condición, es 1, y si no, es nulo. El efecto es equivalente a filtrar dónde primero, luego contar (*).

--使用if作为count的参数
select count(if(year='2020',1,null)) from pos_rival;

--先过滤,再count
select count(1) from pos_rival where year='2020';

--两者结果一致

En base a esto, se puede usar una declaración para contar múltiples resultados de recuento o suma, como:

--统计year=2020且brand=10的数据条数
--统计year=2020的所有数据的price的总和
select 
    count(if(year='2020' and brand='10',1,null)) as count,
    sum(case when year='2020' then price else 0 end) as sum
from
    pos_rival;

2. Utilice campos de exclusión habituales

Hive y spark-sql admiten el uso de campos de selección regulares, como:

--需开启支持正则配置,否则会报错
SET spark.sql.parser.quotedRegexColumnNames=true;

--选择除了rk以外的所有字段
SELECT `(rk)?+.+`
FROM
pos_rival
;

3. Ajuste la cantidad de archivos generados por hive y spark-sql

Tanto el paralelismo de chispa como el número de reducción de colmena pueden afectar el número de archivos, pero modificar el paralelismo y reducir el número afectará al rendimiento. Con SQL puro, no puede usar el operador colesce de Spark para reducir particiones.

Puede utilizar DISTRIBUTE BY para ajustar el número de archivos generados.

--DISTRIBUTE BY 一个常数,则将所有数据放入一个分区,即产生一个文件
INSERT OVERWRITE TABLE ldldwd.pos_rival

SELECT *
FROM ldlsrc.pos_rival

DISTRIBUTE BY 1
;

--DISTRIBUTE BY 一个随机数,将数据随机放入一个分区,产生分区个数相同的文件数
--以下代码CAST(RAND() * 5 AS INT),随机生成整数0~4,即生成五个文件
INSERT OVERWRITE TABLE ldldwd.pos_rival

SELECT *
FROM ldlsrc.pos_rival

DISTRIBUTE BY CAST(RAND() * 5 AS INT)
;

4. Use con as para mejorar la legibilidad de sql

Desde un punto de vista gramatical, con tal cual es para extraer declaraciones de subconsultas individuales de declaraciones SQL y organizarlas como un solo nombre. En la declaración original, puede usar el nuevo alias en su lugar.

Como:

--将从pos_rival中查询出的结果命名为a
--将从pos_rival_brand中查询出的结果命名为b
--将a 与 b 进行join


with a as (select * from pos_rival where dt>='2020-01-01'),
with b as (select * from pos_rival_brand where dt>='2020-01-01') 
select * from a left join b on a.brand=b.brand;

 

Supongo que te gusta

Origin blog.csdn.net/x950913/article/details/106941355
Recomendado
Clasificación