Очистка данных
Бывают случаи, когда исходные данные, загруженные в Qlik Sense, имеют вид, отличный от того, как они должны выглядеть в приложении Qlik Sense. Qlik Sense предоставляет хост функций и операторов, которые позволяют преобразовывать данные в рабочий формат.
В скрипте Qlik Sense можно использовать сопоставление для замены или изменения значений полей или имен, когда запущен скрипт. Таким образом, сопоставление может использоваться для очистки и согласования данных либо для замены части или всех значений полей.
При загрузке данных из разных таблиц значения полей, обозначающие одно и то же, не всегда имеют одинаковые имена. Поскольку такая разнородность препятствует связыванию, подобную проблему необходимо решать. Это можно сделать достаточно просто, создав таблицу сопоставления для сравнения значений полей.
Таблицы сопоставления
Таблицы, загружаемые с помощью оператора Mapping load или Mapping select, обрабатываются отлично от других таблиц. Они сортируются в отдельной области памяти и используются только в качестве таблиц сопоставления в ходе выполнения скрипта. После выполнения скрипта эти таблицы автоматически исключаются.
Правила:
- Таблица сопоставления должна состоять из двух столбцов, первый из которых содержит значения, используемые для сравнения, а второй — желаемые значения для сопоставления.
- Двум столбцам следует присвоить имена, но имена сами по себе не важны. Имена столбцов не связаны с именами полей в обычных внутренних таблицах.
Функции и операторы Mapping
В данном учебном пособии описаны следующие операторы/функции сопоставления.
• Префикс Mapping
• ApplyMap()
• MapSubstring()
• Оператор Map … Using
• Оператор Unmap
Префикс Mapping
Префикс Mapping используется в скрипте для создания таблицы сопоставления. Затем таблицу сопоставления можно использовать с функцией ApplyMap(), MapSubstring() или оператором Map … Using.
Выполните следующие действия.
- Создайте новое приложение и дайте ему имя.
- Добавьте новый раздел скрипта в Редакторе загрузки данных.
- Вызовите раздел Countries.
- Введите следующий скрипт:
CountryMap:
MAPPING LOAD * INLINE [
Country, NewCountry
U.S.A., US
U.S., US
United States, US
United States of America, US
];
Таблица CountryMap содержит два столбца: Country и NewCountry. Столбец Country содержит различные способы введения стран в поле Country. Столбец NewCountry хранит способ сопоставления этих значений. Эта таблица сопоставления будет использоваться для хранения согласованных значений страны US в поле Country. Например, если значение U.S.A. хранится в поле Country, сопоставьте его со значением US.
ApplyMap() функция
Используйте оператор ApplyMap(), чтобы заменить данные в поле, основываясь на ранее созданной таблице сопоставления. Таблицу сопоставления необходимо загрузить до использования функции ApplyMap(). Данные в таблице Data.xlsx, которые будут загружаться, выглядят следующим образом:
ID | Имя | Страна | Код |
---|---|---|---|
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 |
Обратите внимание, что название страны вводилось различными способами. Чтобы согласовать поля «country», загружается таблица сопоставления и используется функция ApplyMap().
Выполните следующие действия.
- Ниже введенного выше скрипта выберите и загрузите Data.xlsx, а затем вставьте данный скрипт.
- Введите следующее над вновь созданным оператором LOAD:
- Измените строку, содержащую Country,, следующим образом:
- Щелкните команду Загрузить данные.
- Добавьте 'US' в качестве третьего параметра функции ApplyMap(), чтобы обрабатывать такие случаи, когда страна указана неправильно.
- Щелкните команду Загрузить данные.
Data:
Скрипт должен выглядеть следующим образом:
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,
Первый параметр функции ApplyMap() — это имя сопоставления, заключенное в одинарные кавычки. Второй параметр — это поле с данными, которые необходимо заменить.
Полученная таблица выглядит следующим образом:
Все различные варианты написания United States были заменены на US. Есть одна запись, которая была написана неправильно, поэтому функция ApplyMap() не изменила значение этого поля. В функции ApplyMap() можно использовать третий параметр для добавления выражения по умолчанию, если в таблице сопоставления нет соответствующего значения.
ApplyMap('CountryMap', Country, 'US') as Country,
Скрипт должен выглядеть следующим образом:
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);
Полученная таблица выглядит следующим образом:
MapSubstring() функция
Функция MapSubstring() позволяет сопоставлять части поля.
В таблице, созданной функцией ApplyMap(), нам теперь необходимо, чтобы числа записывались в виде текста. Таким образом, функция MapSubstring() будет использоваться для замены числовых данных тестом.
Для этого сначала необходимо создать таблицу сопоставления.
Выполните следующие действия.
- Добавьте следующие строки скрипта после раздела CountryMap, но перед разделом Data.
- В разделе скрипта Data измените оператор Code следующим образом:
- Щелкните команду Загрузить данные.
CodeMap:
MAPPING LOAD * INLINE [
F1, F2
1, one
2, two
3, three
4, four
5, five
11, eleven
];
В таблице CodeMap сопоставлены числа от 1 до 5, и 11.
MapSubString('CodeMap', Code) as Code
Скрипт должен выглядеть следующим образом:
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);
Полученная таблица выглядит следующим образом:
В поле Code числовые символы были заменены текстом. Если число повторяется несколько раз, как для ID=3 и ID=4, текст также повторяется. ID=4. Susan McDaniels имеет в коде цифру 6. Поскольку цифра 6 не была сопоставлена в таблице CodeMap, она остается без изменений. ID=5, Dean Smith имеет в коде 111. Этому числу сопоставлен текст 'elevenone'.
Map … Using
Оператор Map … Using может быть также использован для применения сопоставления к полю. Однако он работает немного по-другому, чем функция ApplyMap(). В то время как ApplyMap() выполняется при каждом появлении имени поля в выражении, Map … Using применяет сопоставление, если значение сохранено во внутренней таблице под определенным именем поля.
Давайте разберем пример. Допустим, что мы несколько раз загружали поле Country в скрипт и хотели, чтобы сопоставление применялось при каждой загрузке поля. Можно использовать функцию ApplyMap(), как рассматривалось ранее в данном учебном пособии, или можно использовать Map … Using.
Если Map … Using используется, когда сопоставление применяется к полю, это поле сохраняется во внутреннюю таблицу. Таким образом, в примере ниже сопоставление применяется к полю Country в таблице Data1, но не применяется к полю Country2 в таблице Data2. Это происходит, потому что оператор Map … Using применяется только к полям с именем Country. Когда поле Country2 сохраняется во внутреннюю таблицу, его имя уже не Country. Чтобы сопоставление применялось к таблице Country2, необходимо использовать функцию ApplyMap().
Оператор Unmap завершает работу оператора Map … Using, поэтому, если поля Country были загружены после оператора Unmap, функция CountryMap не будет применена.
Выполните следующие действия.
- Замените скрипт для таблицы Data на следующее:
- Щелкните команду Загрузить данные.
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;
Полученная таблица выглядит следующим образом: