Limpieza de datos
En ocasiones los datos fuente que cargamos en Qlik Sense no tienen exactamente el formato que deseamos en nuestra app de Qlik Sense. Qlik Sense ofrece una serie de funciones y sentencias que permiten transformar nuestros datos en un formato que nos vaya bien.
La sentencia mapping se puede utilizar en un script de Qlik Sense para reemplazar o modificar valores de campo o nombres cuando se ejecuta el script, así pues mapping puede servir para limpiar los datos y hacer que sean más sistematizados o para reemplazar la totalidad o partes de un valor de campo.
Cuando cargamos datos de distintas tablas, los nombres de los valores de campo no se han asignado siempre de forma sistemática. Esta falta de sistematicidad, aparte de ser molesta, impide también las asociaciones, es decir, que se hace imprescindible resolver el problema. La forma elegante de solucionar esto es creando una tabla de correspondencias que compare los valores de campo.
Tablas de correspondencia
Las tablas cargadas mediante Mapping load o Mapping select se tratan de manera diferente a otras tablas. Se almacenan en un área aparte de la memoria, y se usan solo como tablas de enlace durante la ejecución del script. Tras ejecutarse el script estas tablas se eliminan automáticamente.
Reglas:
- Una tabla de correspondencia debe tener dos columnas, la primera con los valores de la comparación y la segunda con los valores que se desea enlazar.
- Las dos columnas deben tener nombre, pero los nombres no tienen importancia por sí mismos. Los nombres de las columnas no tienen conexión con los nombres de campo en las tablas internas regulares.
Funciones y sentencias Mapping
Este tutorial aborda el uso de las siguientes funciones/sentencias de asignación de correspondencias:
• El prefijo Mapping
• ApplyMap()
• MapSubstring()
• La sentencia Map … Using
• La sentencia Unmap
El prefijo mapping
El prefijo Mapping se usa en un script para crear una tabla de correspondencia. La tabla de correspondencia se puede utilizar después con la función ApplyMap(), la función MapSubstring() o la sentencia Map … Using.
Haga lo siguiente:
- Cree una nueva app y asígnele un nombre.
- Agregue una nueva sección de script en el Editor de carga de datos.
- Denomine a la sección Countries.
- Introduzca el siguiente script:
CountryMap:
MAPPING LOAD * INLINE [
Country, NewCountry
U.S.A., US
U.S., US
United States, US
United States of America, US
];
La tabla CountryMap almacena dos columnas: Country y NewCountry. La columna Country almacena las diversas formas en que se ha introducido country/país en el campo Country. La columna NewCountry almacena cómo se asignarán los valores. Esta tabla de correspondencia se utilizará para almacenar valores sistemáticos del país US en el campo Country. Por ejemplo, si U.S.A. se almacena en el campo Country, asígnelo como de US.
La función ApplyMap()
Use ApplyMap() para reemplazar datos de un campo basándose en una tabla de correspondencia previamente creada. La tabla de correspondencia debe cargarse previamente para poder utilizar la función ApplyMap(). Los datos en la tabla Data.xlsx que cargará se verán así:
ID | Nombre | País: | Código |
---|---|---|---|
1 | John Black | Estados Unidos | SDFGBS1DI |
2 | Steve Johnson | EE.UU. | 2ABC |
3 | Mary White | USA | DJY3DFE34 |
4 | Susan McDaniels | u | DEF5556 |
5 | Dean Smith | US | KSD111DKFJ1 |
Observe que el país se introduce de diversas maneras. Para hacer que el campo país sea consistente, se carga la tabla de correspondencia y después se utiliza la función ApplyMap().
Haga lo siguiente:
- Debajo del script que introdujo arriba, seleccione y cargue Data.xlsx, y luego inserte el script.
- Inserte lo siguiente sobre la sentencia LOAD recién creada:
- Modifique la línea que contiene Country, de la siguiente manera:
- Haga clic en Cargar datos.
- Añada 'US' como el tercer parámetro de la función ApplyMap(), para manejar tales casos cuando el país se haya introducido incorrectamente:
- Haga clic en Cargar datos.
Data:
Su script debería tener el aspecto siguiente:
CountryMap:
MAPPING LOAD * INLINE [
Country, NewCountry
U.S.A., US
U.S., US
United States, US
United States of America, US
];
Data:
LOAD
ID,
Name,
Country,
Code
FROM [lib://DataFiles/Data.xlsx]
(ooxml, embedded labels, table is Sheet1);
ApplyMap('CountryMap', Country) as Country,
El primer parámetro de la función ApplyMap() tiene el nombre de enlace entre paréntesis simples. El segundo parámetro es el campo que tiene los datos que se han de reemplazar.
La tabla resultante tiene el siguiente aspecto:
Las diversas grafías de United States se han modificado por US. Hay un registro que no se escribió correctamente, por lo que la función ApplyMap() no cambió ese valor del campo. Usando la función ApplyMap(), puede usar el tercer parámetro para agregar una expresión predeterminada si la tabla de correspondencia no tiene un valor coincidente.
ApplyMap('CountryMap', Country, 'US') as Country,
Su script debería tener el aspecto siguiente:
CountryMap:
MAPPING LOAD * INLINE [
Country, NewCountry
U.S.A., US
U.S., US
United States, US
United States of America, US
];
Data:
LOAD
ID,
Name,
ApplyMap('CountryMap', Country, 'US') as Country,
Code
FROM [lib://DataFiles/Data.xlsx]
(ooxml, embedded labels, table is Sheet1);
La tabla resultante tiene el siguiente aspecto:
La función MapSubstring()
La función MapSubstring() le permite asignar partes de un campo.
En la tabla creada por ApplyMap() ahora queremos que los números se escriban como texto, por lo que la función MapSubstring() se utilizará para reemplazar los datos numéricos por texto.
Para hacer esto debemos crear primero una tabla de correspondencia.
Haga lo siguiente:
- Añada las siguientes líneas de script al final de la sección CountryMap, pero antes de la sección Data.
- En la sección Data del script modifique la sentencia Code de la siguiente manera:
- Haga clic en Cargar datos.
CodeMap:
MAPPING LOAD * INLINE [
F1, F2
1, one
2, two
3, three
4, four
5, five
11, eleven
];
En la tabla CodeMap, los números del 1 al 5, y 11 están enlazados.
MapSubString('CodeMap', Code) as Code
Su script debería tener el aspecto siguiente:
CountryMap:
MAPPING LOAD * INLINE [
Country, NewCountry
U.S.A., US
U.S., US
United States, US
United States of America, US
];
CodeMap:
MAPPING LOAD * INLINE [
F1, F2
1, one
2, two
3, three
4, four
5, five
11, eleven
];
Data:
LOAD
ID,
Name,
ApplyMap('CountryMap', Country, 'US') as Country,
MapSubString('CodeMap', Code) as Code
FROM [lib://DataFiles/Data.xlsx]
(ooxml, embedded labels, table is Sheet1);
La tabla resultante tiene el siguiente aspecto:
Los caracteres numéricos fueron reemplazados por texto en el campo Code. Si un número aparece más de una vez como es el caso de ID=3 y ID=4, el texto también se repite. ID=4. Susan McDaniels tenía un 6 en su código. Puesto que 6 no estaba enlazado en la tabla CodeMap, permanece sin modificar. ID=5, Dean Smith, tenía 111 en su código. Esto se ha enlazado como 'elevenone'.
Map … Using
La sentencia Map … Using también se puede utilizar para aplicar un mapa a un campo. No obstante, funciona de una manera un poco diferente a ApplyMap(). Mientras que ApplyMap() gestiona la asignación cada vez que se encuentra el nombre del campo, Map … Using trata la asignación cuando el valor se almacena bajo el nombre del campo en la tabla interna.
Echemos un vistazo a un ejemplo. Supongamos que estábamos cargando el campo Country varias veces en el script y queríamos aplicar un mapa cada vez que se cargaba el campo. La función ApplyMap() se puede usar tal como se ilustra anteriormente en este tutorial o se puede usar Map … Using.
Si usamos Map … Using entonces el mapa se aplica al campo cuando el campo se almacena en la tabla interna. Así pues, en el ejemplo a continuación, el mapa se aplica al campo Country de la tabla Data1 pero no se aplicaría al campo Country2 de la tabla Data2. Esto se debe a que la sentencia Map … Using únicamente se aplica a campos denominados Country. Cuando el campo Country2 se almacena en la tabla interna deja de llamarse Country. Si desea que el mapa se aplique a la tabla Country2, debe utilizar la función ApplyMap().
La sentencia Unmap pone fin a la sentencia Map … Using, de modo que si se fuera a cargar Country detrás de la sentencia Unmap, CountryMap no se aplicaría.
Haga lo siguiente:
- Reemplace el script de la tabla Data con lo siguiente:
- Haga clic en Cargar datos.
Map Country Using CountryMap;
Data1:
LOAD
ID,
Name,
Country
FROM [lib://DataFiles/Data.xlsx]
(ooxml, embedded labels, table is Sheet1);
Data2:
LOAD
ID,
Country as Country2
FROM [lib://DataFiles/Data.xlsx]
(ooxml, embedded labels, table is Sheet1);
UNMAP;
La tabla resultante tiene el siguiente aspecto: