Czyszczenie danych
Czasami konieczne jest przetworzenie danych źródłowych ładowanych do Qlik Sense, aby w aplikacji Qlik Sense miały one pożądaną postać. W rozwiązaniu Qlik Sense dostępnych jest wiele funkcji i instrukcji umożliwiających przekształcanie danych do odpowiedniego formatu.
W skrypcie Qlik Sense można stosować mapowanie w celu zastępowania lub modyfikowania wartości lub nazw pól podczas wykonywania skryptu. Mapowanie umożliwia więc czyszczenie danych i poprawianie ich spójności, jak również zastępowanie wartości pól w części lub w całości.
Podczas ładowania danych z różnych tabel często zdarza się, że pola o identycznym znaczeniu mają różne nazwy. Takie niespójności utrudniają tworzenie asocjacji, więc konieczne jest ich korygowanie. Elegancką metodą rozwiązania tego problemu jest utworzenie tabeli mapowania używanej do porównywania wartości pól.
Tabele mapowania
Tabele ładowane za pomocą Mapping load lub Mapping select są traktowane inaczej niż inne tabele. Są one przechowywane w odrębnym obszarze pamięci i używane wyłącznie jako tabele mapowania podczas wykonywania skryptu. Po wykonaniu skryptu tabele te są automatycznie usuwane.
Reguły:
- Tabela mapowania musi zawierać dokładnie dwie kolumny, z których pierwsza zawiera wartości sprawdzane, a druga pożądane wartości docelowe mapowania.
- Obie kolumny muszą mieć nazwy, ale same nazwy nie mają żadnego znaczenia. Podane tu nazwy kolumn nie są w żaden sposób związane z nazwami pól zwykłych tabel wewnętrznych.
Funkcje i instrukcje Mapping
W tym kursie zostaną omówione następujące funkcje i instrukcje mapowania:
• Prefiks Mapping
• ApplyMap()
• MapSubstring()
• Instrukcja Map … Using
• Instrukcja Unmap
Prefiks Mapping
Prefiks Mapping służy do utworzenia tabeli mapowania w skrypcie. Takiej tabeli mapowania można następnie używać z funkcją ApplyMap(), funkcją MapSubstring() lub instrukcją Map … Using.
Wykonaj następujące czynności:
- Utwórz nową aplikację i nadaj jej nazwę.
- Dodaj nową sekcję skryptu w edytorze ładowania danych.
- Wywołaj sekcję Countries.
- Wprowadź następujący skrypt:
CountryMap:
MAPPING LOAD * INLINE [
Country, NewCountry
U.S.A., US
U.S., US
United States, US
United States of America, US
];
Tabela CountryMap zawiera dwie kolumny: Country i NewCountry. Kolumna Country zawiera różne wersje nazw krajów wpisane w polu Country. Kolumna NewCountry zawiera mapowania tych wartości. Tabela mapowania posłuży do zapisywania w polu Country spójnych wartości odpowiadających Stanom Zjednoczonym (w tym przypadku US). Jeśli na przykład pole Country zawiera wartość U.S.A., zostanie ona zmapowana na US.
ApplyMap() funkcja
Użyj ApplyMap(), aby zastąpić dane w polu na podstawie wcześniej utworzonej tabeli mapowania. Przed użyciem funkcji ApplyMap() trzeba załadować odpowiednią tabelę mapowania. Dane w tabeli Data.xlsx, które zostaną załadowane, wyglądają następująco:
Identyfikator | Name | Country | Kod |
---|---|---|---|
1 | John Black | U.S.A. | SDFGBS1DI |
2 | Steve Johnson | U.S. | 2ABC |
3 | Mary White | United States | DJY3DFE34 |
4 | Susan McDaniels | u | DEF5556 |
5 | Dean Smith | US | KSD111DKFJ1 |
Należy zauważyć, że kraj jest wprowadzany na różne sposoby. Aby zawartość pola kraju była spójna, ładujemy tabelę mapowania i używamy funkcji ApplyMap().
Wykonaj następujące czynności:
- Poniżej skryptu wprowadzonego powyżej wybierz i załaduj plik Data.xlsx, a następnie wstaw skrypt.
- Wprowadź następujące dane powyżej nowej utworzonej instrukcji LOAD:
- Zmodyfikuj wiersz zawierający pole Country, w następujący sposób:
- Kliknij polecenie Ładuj dane.
- Dodaj wartość 'US' jako trzeci parametr funkcji ApplyMap(), co pozwoli obsłużyć przypadki nieprawidłowego wpisania kraju:
- Kliknij polecenie Ładuj dane.
Data:
Skrypt powinien wyglądać następująco:
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,
Pierwszy parametr funkcji ApplyMap() to nazwa mapy w pojedynczych cudzysłowach. Drugi parametr określa pole zawierające dane, które będą zastępowane.
Wynikowa tabela wygląda następująco:
Wszystkie warianty nazwy United States zostały zamienione na US. Jeden z rekordów zawierał błąd pisowni, więc funkcja ApplyMap() nie zmieniła tej wartości pola. Do funkcji ApplyMap() można dodać trzeci parametr w celu określenia wyrażenia domyślnego, które będzie używane w razie braku pasującej wartości w tabeli mapowania.
ApplyMap('CountryMap', Country, 'US') as Country,
Skrypt powinien wyglądać następująco:
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);
Wynikowa tabela wygląda następująco:
MapSubstring() funkcja
Funkcja MapSubstring() umożliwia mapowanie części pola.
Przetworzymy tabelę utworzoną przez funkcję ApplyMap(), aby liczby były zapisane słownie. Funkcja MapSubstring() posłuży do zastąpienia danych liczbowych tekstem.
W tym celu trzeba najpierw utworzyć tabelę mapowania.
Wykonaj następujące czynności:
- Dodaj następujące wiersze skryptu po sekcji CountryMap, ale przed sekcją Data.
- W sekcji Data skryptu zmodyfikuj instrukcję Code następująco:
- Kliknij polecenie Ładuj dane.
CodeMap:
MAPPING LOAD * INLINE [
F1, F2
1, one
2, two
3, three
4, four
5, five
11, eleven
];
Tabela CodeMap mapuje liczby od 1 do 5 oraz liczbę 11.
MapSubString('CodeMap', Code) as Code
Skrypt powinien wyglądać następująco:
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);
Wynikowa tabela wygląda następująco:
Zapisy liczbowe w polu Code zostały zastąpione tekstem. Jeśli liczba występuje więcej niż raz, jak w przypadku ID=3 i ID=4, tekst również jest powtarzany. ID=4. Susan McDaniels zawiera wartość 6 w kodzie. Ponieważ dla liczby 6 nie określono mapowania w tabeli CodeMap, pozostała ona bez zmian. W kodzie osoby o ID=5 (Dean Smith) występowała liczba 111. Została ona zmapowana jako „elevenone”.
Map … Using
Za pomocą funkcji Map … Using można zastosować mapę do pola. Jednak, działa to trochę inaczej niż w przypadku funkcji ApplyMap(). W przypadku funkcji ApplyMap() mapowanie jest stosowane przy każdym napotkaniu nazwy pola przy przetwarzaniu, natomiast instrukcja Map … Using dokonuje mapowania na etapie zapisywania wartości w tabeli wewnętrznej w polu o określonej nazwie.
Przyjrzyjmy się przykładowi. Załóżmy, że wielokrotnie ładujemy pole Country w skrypcie i chcemy stosować mapowanie przy każdym załadowaniu. Można do tego celu użyć funkcji ApplyMap(), jak we wcześniejszej części tego kursu, lub skorzystać z instrukcji Map … Using.
Zastosowanie instrukcji Map … Using spowoduje zastosowanie mapy do pola na etapie zapisywania pola w tabeli wewnętrznej. W poniższym przykładzie mapowanie zostanie zastosowane do pola Country w tabeli Data1, ale nie do pola Country2 w tabeli Data2. Wynika to stąd, że instrukcja Map … Using jest stosowana jedynie do pól o nazwie Country. Po zapisaniu w tabeli wewnętrznej pole Country2 nie ma już nazwy Country. Jeśli mapowanie miałoby być stosowane również do tabeli Country2, należałoby użyć funkcji ApplyMap().
Instrukcja Unmap kończy instrukcję Map … Using, więc gdyby pole Country zostało załadowane po instrukcji Unmap, tabela mapowania CountryMap nie zostałaby zastosowana.
Wykonaj następujące czynności:
- Skrypt dla tabeli Data zastąp następującym skryptem:
- Kliknij polecenie Ładuj dane.
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;
Wynikowa tabela wygląda następująco: