¿Cómo combinar la expresión de grupo y la expresión de cubo en la cláusula GROUP BY de SparkSQL?
Quiero usar group by
y cube
en SparkSQL, como select a,b,c,sum(d) from table group by a, cube(b,c)
, pero arrojó java.lang.UnsupportedOperationException
, parece que solo puedo usar uno de ellos (expresión de grupo o expresión de cubo).
De esta manera se puede lograr en Postgre o Presto, y escribiendo los detalles de cómo usarlo en la documentación de SparkSql en el siguiente fragmento.
Analítica de agrupación mixta/anidada
Una cláusula GROUP BY puede incluir múltiples group<em>expressions y múltiples CUBE|ROLLUP|GROUPING SETSs. Las GROUPING SETS también pueden tener cláusulas anidadas CUBE|ROLLUP|GROUPING SETS, por ejemplo, GROUPING SETS(ROLLUP(warehouse, location), CUBE(warehouse, location)), GROUPING SETS(warehouse, GROUPING SETS(location, GROUPING SETS(ROLLUP(warehouse, location), CUBE(warehouse, location)))). CUBE|ROLLUP es solo azúcar sintáctica para GROUPING SETS, por favor refiérase a las secciones anteriores para saber cómo traducir CUBE|ROLLUP a GROUPING SETS. La group</em>expression puede tratarse como un conjunto de grupo único bajo este contexto. Para múltiples GROUPING SETS en la cláusula GROUP BY, generamos un solo GROUPING SETS haciendo un producto cruzado de los GROUPING SETS originales. Para GROUPING SETS anidados en la cláusula GROUPING SETS, simplemente tomamos sus conjuntos de agrupación y los eliminamos. Por ejemplo, GROUP BY warehouse, GROUPING SETS((product), ()), GROUPING SETS((location, size), (location), (size), ()) y GROUP BY warehouse, ROLLUP(product), CUBE(location, size) son equivalentes a GROUP BY GROUPING SETS( (warehouse, product, location, size), (warehouse, product, location), (warehouse, product, size), (warehouse, product), (warehouse, location, size), (warehouse, location), (warehouse, size), (warehouse)).
GROUP BY GROUPING SETS(GROUPING SETS(warehouse), GROUPING SETS((warehouse, product))) es equivalente a GROUP BY GROUPING SETS((warehouse), (warehouse, product)).
davy.ai
Si quieres usar
group by
ycube
juntos en SparkSql, te encontrarás con el errorjava.lang.UnsupportedOperationException
. Esto se debe a que SparkSql solo permite que se use una de las dos expresiones (expresión de grupo o expresión de cubo). Sin embargo, en Postgre o Presto es posible usar ambas juntas.Para lograr análisis de agrupamiento mixto/anidado como
GROUPING SETS
, puedes usar múltiplesgroup_expressions
y múltiplesCUBE|ROLLUP|GROUPING SETS
en la cláusulaGROUP BY
. Para múltiplesGROUPING SETS
, SparkSql genera un soloGROUPING SETS
haciendo un producto cruzado de losGROUPING SETS
originales. Para losGROUPING SETS
anidados en la cláusulaGROUPING SETS
, simplemente toma sus conjuntos de agrupamiento y los despoja.Aquí tienes un ejemplo de cómo usar esto en SparkSql:
Esto agrupará los datos por
warehouse
,warehouse
yproduct
, ylocation
ysize
. El resultado contendrá la suma de la columnaamount
para cada grupo.Ten en cuenta que
CUBE|ROLLUP
es solo un azúcar sintáctico paraGROUPING SETS
. Por lo tanto, puedes usarGROUPING SETS
en lugar deCUBE|ROLLUP
.Para obtener más información, puedes consultar la documentación de SparkSql sobre análisis de agrupamiento mixto/anidado.