TodoBI - Business Intelligence, Big Data, ML y AI TodoBI - Business Intelligence, Big Data, ML y AI

Como crear tablas agregadas en Mondrian y no morir en el intento

En la web de Mondrian (usado en Pentaho y otros sistemas BI) hay documentación detallada sobre cómo crear tablas agregadas, pero ya sabemos que la teoría es muy bonita y distinta de la práctica… Aunque es recomendable leerla antes de empezar a hacer algo con tablas agregadas ( http://mondrian.pentaho.com/documentation/aggregate_tables.php ), en este post, nuestros compañeros de Stratebi nos dan los detalles y los pasos a seguir para crear una tabla agregada en Pentaho y que funcione.
Con el Aggregation Designer podemos diseñar nuestra tabla agregada a medida y nos genera el código (el CREATE TABLE, el “INSERT AS SELECT” y las modificaciones al esquema de mondrian) automáticamente.
Al abrir el Aggregation Designer seleccionamos la conexión a base de datos, el esquema de mondrian, le damos a Apply y seleccionamos el cubo deseado.
En la parte derecha le damos al botón + Add y automáticamente nos crea una nueva tabla agregada.
En la parte izquierda nos aparecen las dimensiones donde podemos seleccionar el nivel de detalle que queremos en cada dimensión. Decidir para qué dimensiones agregar depende de las consultas que más se vayan a hacer sobre el cubo.
Si una dimensión no la queremos usar en la tabla agregada, dejamos la selección como (All) .
Si una dimensión sí la queremos usar en la tabla agregada, seleccionamos el nivel más bajo para llevarnos toda la dimensión; o un nivel superior si queremos que la tabla agregue solo por ese nivel.
Una vez hecho esto le damos al botón de Apply (abajo) y luego al botón de Export (arriba). Esto nos genera los códigos que mencionaba antes y que ya podemos ejecutar en el SGBD.
Reemplazamos el esquema de mondrian y nos guardamos las consultas, ya que habrá que incluirlas luego en la ETL de creación del DM.
Para que mondrian use las tablas agregadas hay que editar el fichero pentaho- solutions/system/mondrian/mondrian.properties y poner a true las propiedades: mondrian.rolap.aggregates.Use y mondrian.rolap.aggregates.Read .
Con esto hecho, reiniciando el servidor, vaciando cachés y actualizando el repositorio de la solución todavía no nos funcionaría el truco y es que Mondrian aplica unas reglas concretas en los nombres de las tablas agregadas. La sorpresa es que el código generado por el Aggregation Designer no cumple estas reglas (!!). Y si estas reglas no se cumplen, Mondrian no utilizará la tabla agregada para la consulta.
Lo aconsejable es hacer los cambios en el esquema (que será el definitivo) y en la tabla agregada en BBDD y luego sacar el código del “INSERT AS SELECT” comparando el código original con el nuevo, lo que cambia es solo el nombre de las columnas. El nuevo código DDL se saca facilmente con un dump.
Estas reglas se detallan en la documentación de Mondrian pero como hay varias opciones y no todas me han funcionado, os cuento la que a mí sí me han servido:
Nombre de la tabla agregada: agg_CUALQUIERCOSA_NOMBRETABLA . Si la tabla se llama fact_SteelWheels vale por ejemplo agg_ventas_por_producto_SteelWheels. Me ha dado problemas que la tabla de hechos empiece por “fact_”. Por no crear un nombre de tabla agregada demasiado grande, Mondrian permite quitar este prefijo en la tabla agregada.
La columna que se detalla en la etiqueta debe llamarse fact_count , en BBDD y en el esquema.
El atributo column (en el esquema) de las medidas debe llamarse igual que el campo de BBDD de la tabla agregada y éste debe llamarse igual que el campo de BBDD del nivel de la dimensión (especificado en el atributo column también). Un ejemplo:
Si tenemos esta dimensión de tiempo:

column="Year" type="String" uniqueMembers="false" levelType="TimeYears" hideMemberIf="Never">
column="Quarter" type="String" uniqueMembers="false" levelType="TimeQuarters" hideMemberIf="Never">
column="YearMonthNumber" ordinalColumn="id_Date" type="String" uniqueMembers="false"
levelType="TimeMonths" hideMemberIf="Never">
Y queremos incluirla entera en la tabla agregada, deberemos poner las siguientes etiquetas:
column="Year" name="[Time].[Year]"> column="Quarter" name="[Time].[Quarter]">
column="YearMonthNumber" name="[Time].[Month]">
En BBDD, deberemos cambiar los nombres de las columnas por Year, Quarter y YearMonthNumber.
Para las medidas se aplica la misma regla. Por ejemplo, una medida definida así en el cubo:
column="SalesValue" formatString="#,##0 €" aggregator="sum" visible="true">
Hay que definirla así en la tabla agregada:
column="SalesValue" name="[Measures].[Sales]">
Y en BBDD, deberemos modificar el nombre de la columna por SalesValue.
Por último, para comprobar que funciona, podemos activar el log en SQL de Pentaho y hacer una vista de análisis candidata a usar la tabla agregada. Deberíamos ver que las consultas SQL se están generando sobre la tabla agregada.
Para activar el log en SQL hay que descomentar en el fichero: tomcat/webapps/pentaho/WEB-INF/classes/log4j.xml la parte que pone “Special Log File specifically for Mondrian SQL Statements” al final del documento. El fichero de log en SQL se guarda en tomcat/bin/mondrian_sql.log