<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Программирование методов разрешения сущностей и слияния данных при реализации ETL в среде Hadoop*</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>alexey.vovchenko@gmail.com</string-name>
        </contrib>
      </contrib-group>
      <fpage>26</fpage>
      <lpage>34</lpage>
      <abstract>
        <p>В статье обсуждаются вопросы разрешения сущностей (Entity Resolution) и слияния данных (Data Fusion) в контексте интеграции больших данных в среде Hadoop. Проблема разрешения сущностей ориентирована на решение таких задач как выявление дубликатов (Duplicate Detection), удаление дубликатов (Deduplication), связывание записей (Record Linkage), идентификация объектов (Object Identification), сопоставление связей (Reference Matching) и др. Проблема слияния данных является заключительным этапом интеграции данных. В работе дан краткий обзор методов разрешения сущностей и методов слияния данных. Затем в работе рассматриваются вопросы адаптации таких методов к их применению в ETL процессе при интеграции больших данных в Hadoop. Рассмотрены способы программирования методов разрешения сущностей и слияния данных как части ETL процесса.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>* Работа выполнена при поддержке РФФИ (гранты
13-07-00579, 14-07-00548) и Президиума РАН (Программа
фундаментальных исследований Президиума РАН № 16
«Фундаментальные проблемы системного
программирования»).</p>
      <p>
        Для анализа больших объемов накапливаемых
данных используются современные распределенные
инфраструктуры обработки массивных данных
(например, Hadoop [
        <xref ref-type="bibr" rid="ref41 ref45">41, 45</xref>
        ]). Основной
особенностью подобных инфраструктур является
почти линейная горизонтальная масштабируемость
(производительность системы растет линейно
относительно числа узлов кластера).
      </p>
      <p>Главным достоинством подобных инфраструктур
является возможность анализировать и
обрабатывать разно-структурированные данные,
например, реляционные, XML, JSON, тексты и
другие. При этом возникает проблема интеграции
информации, извлекаемой из
разноструктурированных данных.</p>
      <p>
        Традиционно процесс интеграции данных можно
представить состоящим из следующих этапов:
 сопоставление схем (Schema Matching),
 интеграция схем (Schema Integration),
 трансформация данных (Data Transformation),
 разрешение сущностей (Entity Resolution [
        <xref ref-type="bibr" rid="ref17 ref22 ref34">17,
22, 34</xref>
        ]),
 слияние данных (Data Fusion [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ]).
      </p>
      <p>В разделах 2 и 3 дан краткий обзор
традиционных методов разрешения сущностей и
методов слияния данных. В разделе 4 показано как
можно адаптировать стандартные методы
разрешения сущностей при интеграции массивных
данных в среде Hadoop. Наконец, в разделе 5
показаны способы программирования методов
разрешения сущностей и слияния данных как части
ETL процесса в Hadoop.
2 Краткий обзор методов разрешения
сущностей</p>
      <p>
        В общем случае под термином разрешения
сущностей (entity resolution [
        <xref ref-type="bibr" rid="ref17 ref22 ref25 ref26 ref31 ref32 ref34">17, 22, 25–26, 31–32,
34</xref>
        ]) понимается извлечение информации об одной и
той же сущности реального мира из разнообразных
структурированных коллекций данных, приведение
извлеченных данных к унифицированному
представлению. При этом применяются методы
извлечения, сопоставления (matching),
группирования, связывания (linking), устранения
дублирования (deduplication) различных
представлений информации.
      </p>
      <p>
        В общем случае процесс разрешения сущностей
включает следующие этапы [
        <xref ref-type="bibr" rid="ref26">26</xref>
        ]:
 Подготовку данных (Data preparation);
 Выбор методов сопоставления данных (Match
      </p>
      <p>Feature);
 Определение методов разрешения пар
сущностей (Pairwise ER);
 Определение ограничений (ER Constraints);
 Реализацию алгоритма.</p>
      <p>Важным этапом для успешного разрешения
сущностей является подготовка данных, которая
включает нормализацию схем и нормализацию
данных. Нормализация схем включает, например:
 сопоставление атрибутов схем (например,
«контактный телефон» и «мобильный
телефон»);
 слияние атрибутов (например, «полный
адрес» получается из атрибутов «город»,
«индекс» «улица», …);
 слияние множественных значений и списков
(например, «контактные телефоны» и
«основной номер телефона»,
«дополнительный номер телефона») и др.</p>
      <p>Нормализация данных может включать
приведение к строчному или заглавному регистру;
удаление разделителей; поиск и исправления
опечаток; поиск сокращений и аббревиатур и замена
их на полные стандартные формы; использование
словарей для нормализации строк, и много другое.</p>
      <p>
        Сопоставление сущностей может
осуществляться разнообразными способами оценки
сходства (similarity) сущностей. Мера сходства
может быть как булева, так и вещественная.
Применяют следующие методы оценки сходства:
 эквивалентность булевых предикатов;
 вычисление функции сходства значений
(Levenstein [
        <xref ref-type="bibr" rid="ref52">52</xref>
        ], Smith-Waterman [
        <xref ref-type="bibr" rid="ref52">52</xref>
        ]);
 вычисление функции сходства множеств
(Jaccard [
        <xref ref-type="bibr" rid="ref52">52</xref>
        ], Dice [
        <xref ref-type="bibr" rid="ref52">52</xref>
        ]);
 вычисление функции сходства векторов
(Cosine similarity [
        <xref ref-type="bibr" rid="ref49">49</xref>
        ], TFIDF [
        <xref ref-type="bibr" rid="ref50">50</xref>
        ]);
 сходство на основе выравнивания (Jaro –
Winkler [
        <xref ref-type="bibr" rid="ref52">52</xref>
        ], Soft – TFIDF [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ], Monge – Elkan
[
        <xref ref-type="bibr" rid="ref51">51</xref>
        ]);
 сходство фонетических данных: Soundex [
        <xref ref-type="bibr" rid="ref52">52</xref>
        ];
 сходство, основанное на переводе (может
использоваться для нормализации
аббревиатур);
 сходство, основанное на знаниях о
предметной области, и др. [
        <xref ref-type="bibr" rid="ref52">52</xref>
        ].
      </p>
      <p>
        Рассматривают также сходство отношений.
Меры, используемые для отношений, обычно
основаны на сходстве множеств, и предполагают
использование аналогичных функций:
 Common Neighbors,
 Jaccard’s Coefficient,
 Adar Coefficient [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ].
      </p>
      <p>При сравнении пар сущностей они
рассматриваются как вектора, для которых нужно
вычислить их сходство. Традиционным подходом
является подсчет сходства некоторым методом для
каждого из атрибутов независимо. А затем
реализуется подсчет взвешенной суммы. Например:
0.5*1st – author – match – score +
0.2*venue – match – score +
0.3*paper – match – score</p>
      <p>Недостатком этого подхода является сложность
выбора весов для каждого из атрибутов и сложность
выбора порога сходства сущностей. Другим
подходом является задание правил для каждого
атрибута независимо. Например:
(1st – author – match – score &gt; 0.7 AND
venue – match – score &gt; 0.8)
OR (paper – match – score &gt; 0.9 AND
venue – match‐score &gt; 0.9)</p>
      <p>
        Недостатком этого подхода является сложность
формулирования подобных правил вручную.
Применяются также методы, основанные на модели
Fellegi &amp; Sunter [
        <xref ref-type="bibr" rid="ref24">24</xref>
        ].
      </p>
      <p>
        Для сопоставления пар сущностей применяют
также специальные методы машинного обучения,
которые позволяют автоматизировать процесс
формулирования критериев для сопоставления
сущностей:
 Decision trees [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ],
 Support vector machines [
        <xref ref-type="bibr" rid="ref16 ref9">9, 16</xref>
        ],
 Ensembles of classifiers [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ],
 Conditional Random Fields (CRF) [
        <xref ref-type="bibr" rid="ref27">27</xref>
        ].
      </p>
      <p>Недостатком этих подходов является:
несбалансированность результирующих
классифицированных множеств (так, в результате
образуется значительно больше несхожих объектов,
чем схожих), а также высока вероятность того, что
объект не будет причислен ни к какому классу
(схожих, несхожих). Но оба эти недостатка могут
решаться путем тонкой настройки алгоритмов.
Ключевой проблемой при использовании методов
машинного обучения при сравнении пар сущностей
является выбор обучающего множества.</p>
      <p>
        Выделяют следующие методы, не требующие
построения обучающей выборки для классификации
сущностей:
 Обучение без учителя или с частичным
привлечением учителя [
        <xref ref-type="bibr" rid="ref29 ref36 ref42">29, 36, 42</xref>
        ];
 Методы с активным обучением
– Ансамбли классификаторов [
        <xref ref-type="bibr" rid="ref38 ref39">38, 39</xref>
        ];
– Доказуемая оптимизация точности/полноты
(precision/recall) [
        <xref ref-type="bibr" rid="ref3 ref4">3, 4</xref>
        ];
– Краудсорсинг [
        <xref ref-type="bibr" rid="ref33 ref40">33, 40</xref>
        ].
      </p>
      <p>Таким образом, при выборе методов
сопоставления сущностей выделяют: множество
алгоритмов сходства, методы, основанные на
машинном обучении, и методы, основанные на
активном обучении и краудсорсинге. Последняя
группа методов сейчас считается наиболее
перспективной, но требует проведения
дополнительных исследований.</p>
      <p>Примеры правил, используемых
установления сходства сущностей:
для
 Транзитивность: если М1 и М2 схожи, и М2 и
М3 схожи, тогда и М1 и М2 схожи;
 Эксклюзивность: если М1 и М2 схожи, тогда
М3 не может быть схож с М2;
 Функциональные зависимости: если М1 и М2
схожи, тогда М3 и М4 должны быть схожи.
Транзитивность часто используется для методов
удаления дубликатов (Deduplication), а
эксклюзивность используется в методах
установления связей (Record Linkage).</p>
      <p>
        В заключение можно отметить, что разрешение
сущностей является быстро развиваемой областью.
Исследуются новые меры сходства [
        <xref ref-type="bibr" rid="ref52">52</xref>
        ], ведутся
работы по применению перспективных методов
машинного обучения [
        <xref ref-type="bibr" rid="ref3 ref33 ref38 ref39 ref4 ref40">3, 4, 33, 38–40</xref>
        ]. Развивается
применение функциональных зависимостей при
очистке данных (data cleaning) [
        <xref ref-type="bibr" rid="ref13 ref2 ref23">2, 13, 23</xref>
        ]. Ведутся
работы по построению сущностей с наиболее
представительными данными (включающими
данные из разнообразных дубликатов –
Canonicalization [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]). Также ведутся работы по
методам, когда решения по сходству двух
сущностей принимается на основе анализа
совокупности сущностей, применения
вероятностных логик сходства, латентной модели
Дирихле [
        <xref ref-type="bibr" rid="ref14 ref6 ref7">6, 7, 14</xref>
        ].
3 Краткий обзор методов слияния
данных
      </p>
      <p>
        Под слиянием данных (Data Fusion [
        <xref ref-type="bibr" rid="ref10 ref12 ref21">10, 12, 21</xref>
        ])
понимается образование интегрированного
представления информации об одной же сущности
реального мира, полученной из различных
источников данных. Задачами процесса слияния
данных является: слияние записей о сущностях,
разрешение возможных конфликтов, обнаружение и
удаления ошибочных данных. Методы слияния
данных, кратко рассмотренные в данном разделе,
исследованы в Потсдамском университете в
диссертации [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ]. Различные аспекты проблемы
слияния данных представлены на рис. 1.
3.1 Типы конфликтов при слиянии данных
Различают два типа конфликтов: конфликты,
вызванные неопределенными значениями и
конфликты, вызванные противоречивыми
значениями. Неопределенность означает, что в
одном источнике данных содержатся неизвестные
значения (null), а в другом известные. Проблема
заключается в том, что семантика неопределенных
значений (null) может сильно отличаться. Различают
три варианта: неизвестные значения,
несуществующие значения (например, атрибут «имя
супруга» всегда будет null для неженатых), скрытые
значения (такие данные, которые по каким-то
причинам не позволено видеть). Противоречивость
значений означает появление двух различных не
нулевых (not null) значений. Возможны различные
стратегии обработки подобных конфликтов.
Рис. 1. Различные аспекты проблемы слияния данных
3.2 Стратегии разрешения конфликтов
      </p>
      <p>Различают следующие
разрешению конфликтов:
виды
подходов
к
 игнорирование конфликтов;
 избегание конфликтов;
 разрешение конфликтов.</p>
      <p>Стратегия игнорирования конфликтов
предполагает извлечение всей доступной
информации. Например, для строк это может быть
обычная конкатенация строк, а пользователь уже
сам решает, какие данные верны.</p>
      <p>Стратегия избегания конфликтов предполагает
выбор данных на основе самих данных (по
некоторому алгоритму) или на основе метаданных.
Примером функции на основе данных может
служить функция coalesce (выбор первого не
нулевого значения), или функция выбора самого
длинного значения. Примером функций на основе
метаданных может выступать выбор в зависимости
от самого источника (например, известно, что один
из источников наиболее достоверный). Другим
примером является функция выбирающая значение
из того источника, в котором большее число
значений было выбрано для других атрибутов.</p>
      <p>
        Стратегии разрешения конфликтов учитывают
все значения, и выбирают из них «достоверное».
Примером подобной функции могут выступать
всевозможные функции голосования, функции
выбора случайного значения, функции среднего
значения, функции наиболее часто встречающегося
значения и др.
3.3 Основные функции разрешения конфликтов
Вводится операция outer union [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ], результатом
которой является объединение двух отношений.
Если схемы не совпадают, то результирующая схема
является объединением двух исходных схем.
Например, пусть даны два отношения A с набором
атрибутов = {a, b, c, d}, и отношение B с набором
атрибутов = {c, d, e, f}. Результирующая схема
будет содержать набор атрибутов = {a, b, c, d, e, f}.
В результирующие кортежи для недостающих
атрибутов помещаются нулевые значения. Эта
операция не является стандартной и отсутствует в
большинстве реляционных СУБД. В реляционной
алгебре подобная операция может быть
представлена как:
(SELECT a, b, c, d, NULL as e, NULL as f
FROM A)
UNION
(SELECT NULL as a, NULL as b, c, d, e, f
FROM B)
      </p>
      <p>
        Вводится функция tuple subsumption [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ].
Говорят, что кортеж t1 поглощает другой кортеж t2
(поглощаемый кортеж), если у них:
 совпадают схемы;
 в t2 больше неизвестных (null) значений чем в
t1;
 в t2 все известные значения совпадают со
значения в t1.
      </p>
      <p>Например, пусть дан кортеж t1 = (5, ‘text’, null, 7)
и t2 (5, null, null, 7). Видно, что каждый атрибут в t2
либо совпадает с аналогичным атрибутом в t1, либо
он null. Для этого примера кортеж t1 поглощает
кортеж t2.</p>
      <p>
        Вводится функция tuple complementation [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ].
Говорят, что кортежи t1 и t2 дополняют друг друга
если:
 у них совпадают схемы;
 они не совпадают;
 значения соответствующих атрибутов в t1 и
t2 совпадают, либо одно их не определено,
либо оба не определены;
 t1 и t2 имеют как минимум один атрибут,
значения которого совпадают.
      </p>
      <p>Например, пусть дан кортеж t1 = (5, ‘text’, null,
null) и t2 (5, null, null, 7). Видно, что кортежи
дополняют друг друга. Результатом операции
дополнения для этих двух кортежей будет новый
кортеж t = (5, ‘text’, null, 7).
3.4 Операторы слияния данных</p>
      <p>Различают два основных подхода к слиянию
данных. Это подходы основаны на операции
объединения (union based) или на операции
соединения (join based). Различают следующие
основные операции.</p>
      <p>
        Minimum Union [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] (union based). Операция
представляет собой выполнение операции outer
union, а затем удаления из результата всех
поглощаемых (subsumed [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ]) кортежей. Пример
операции представлен на рис. 2.
      </p>
      <p>Рис. 2. Пример операции Minimum Union</p>
      <p>
        Complemetation Union [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] (union based).
Операция представляет собой выполнение операции
outer union, а затем дополнения (complementation)
всех возможных кортежей. Пример операции
представлен на рис. 3.
      </p>
      <p>
        Рис. 3. Пример операции Complementation Union
Grouping and Aggregation [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] (union based).
Операция предполагает выполнение outer union, а
затем группировки
применения функции
атрибутам. Пример
представлен ниже.
      </p>
      <p>по общему атрибуту и</p>
      <p>агрегации к остальным
операции на языке SQL
WITH OU AS (
( SELECT A, B, C, NULL AS D FROM U1 )</p>
      <p>UNION (ALL)
( SELECT A, B, NULL AS C, D FROM U2 )
),
SELECT A, MAX(B), MIN(C), SUM(D)
FROM OU
GROUP BY A</p>
      <p>
        Full Disjunction [
        <xref ref-type="bibr" rid="ref37">37</xref>
        ] (join based). Операция
представляет собой full outer join (стандартная
реляционная операция), после чего применяется
subsumption к результату. Пример представлен на
рис. 4.
      </p>
      <p>Рис. 4. Пример операции Full Disjunction</p>
      <p>
        Match Join [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] (union+join based). В операции
выбираются всевозможные комбинации значения
атрибутов, после чего выполняется full outer join.
Фактически реализуется outer union двух
коллекций. После чего определяется N – 1
вспомогательных отношений, где N – число
атрибутов, каждое из которых содержит по два
атрибута, один общий, и какой-то другой. После
чего происходит full outer join N – 1-го отношения.
Пример реализации операции на языке SQL
представлен ниже.
      </p>
      <p>WITH</p>
      <p>OU(A,B,C,D) AS (
( SELECT A, B, C, NULL AS D FROM U1 )</p>
      <p>UNION
( SELECT A, B, NULL AS C, D FROM U2 )
),//  Outer Union</p>
      <p>B_V (A,B) AS ( SELECT DISTINCT A, B
FROM OU ), //  1-е отношение (N = 4)</p>
      <p>C_V (A,C) AS ( SELECT DISTINCT A, C
FROM OU ), //  2-е отношение (N = 4)</p>
      <p>D_V (A,D) AS ( SELECT DISTINCT A, D
FROM OU ), //  3-е отношение (N = 4)
SELECT A, B, C, D
FROM B_V FULL OUTER JOIN C_V FULL OUTER
JOIN D_V //  Full Outer Join</p>
      <p>Merge (union+join based). Операция объединяет
операции соединения и объединения. Для каждого
общего атрибута формируются две версии значений,
нулевые значения удаляются функцией COALESCE
(выбор первого ненулевого значения). Пусть даны
два отношения A с набором атрибутов {a, b, c} и B с
набором атрибутов {a, b, d}. a – конфликтующий
атрибут, b – атрибут с нулевыми значениями.
Пример реализации на SQL представлен ниже, а
результат операции представлен на рис. 5.</p>
      <p>Рис. 5. Пример операции Merge
4 Разрешение сущностей для больших
данных</p>
      <p>
        Для манипулирования большими
разноструктурированными данными служат Hadoop
инфраструктуры [
        <xref ref-type="bibr" rid="ref41 ref45">41, 45</xref>
        ], предоставляющие
масштабируемое хранилище и обеспечивающие
высокую скорость обработки больших данных за
счет распределенной их обработки. Таким образом,
для применения методов нужна адаптация
алгоритмов для их распределенного выполнения на
различных узлах Hadoop кластера.
      </p>
      <p>
        В среде Hadoop реализована парадигма
распределенного программирования для анализа
данных Map-Reduce [
        <xref ref-type="bibr" rid="ref20 ref46">20, 46</xref>
        ], по имения основных
функций. В начале на всех узлах кластера
обрабатываются блоки данных независимо друг от
друга (Map). После чего данные группируются по
заранее выбранным для алгоритма ключам и
поступают на выполнение на один или более узел в
зависимости от алгоритма (Reduce).
      </p>
      <p>
        Таким образом для реализации любого
алгоритма в Hadoop инфраструктуре требуется его
адаптация к виду Map-Reduce. Другим вариантом
является реализация алгоритма на одном из языков
высокого уровня, таких как: Pig [
        <xref ref-type="bibr" rid="ref47">47</xref>
        ], Hive [
        <xref ref-type="bibr" rid="ref48">48</xref>
        ], Jaql
[
        <xref ref-type="bibr" rid="ref43 ref44">43, 44</xref>
        ]. Все эти языки автоматически
переписывают программы, реализованные на них, в
Map-Reduce приложения для выполнения на Hadoop
кластере.
      </p>
      <p>
        В случае больших данных и распределенных
инфраструктур традиционные подходы требуют
доработок. Различают два основных метода
разрешения сущностей над большими данными:
разбиение данных на блоки (blocking [
        <xref ref-type="bibr" rid="ref19 ref35">19, 35</xref>
        ]) и
распределенный метод разрешения сущностей.
      </p>
      <p>
        Суть разбиения на блоки заключается в
следующем. Пусть у нас представлены 1000
компаний в 1000 городах. И нам нужно сравнить
компании. Алгоритм полного попарного сравнения
потребует 1012 сравнений. При этом, если
предположить, что компании из разных городов не
могут совпадать, то потребуется 109 сравнений.
Ключевой проблемой данного подхода является
выбор критерия, по которому разбивать данные.
Различают два основных метода: основанный на хэш
функции [
        <xref ref-type="bibr" rid="ref26">26</xref>
        ], и основанный на сходстве соседей [
        <xref ref-type="bibr" rid="ref26">26</xref>
        ].
Метод, основанный на хэш функции, предполагает
разбиение на блоки по хэш ключу. Основной
проблемой алгоритма является выбор хэш функции.
Метод, основанный на сходстве соседей,
предполагает, что совпадать могут только объекты,
схожие по некоторой мере. Все объекты сортируются
по какому-то признаку (ключу – простому или
составному, уникальность ключа не требуется).
После этого выбирается размер окна. И объекты
сравниваются только внутри окна. Проблемой
данного метода является выбор ключа сортировки.
      </p>
      <p>
        Распределенный метод разрешения сущностей
предполагает реализацию традиционных
алгоритмов этого семейства в виде Map-Reduce
приложения, что требует зачастую полного
пересмотра исходного алгоритма. Другой вариант –
реализация алгоритма разрешения сущностей на
специализированных языках, чему будет посвящен
следующий раздел. Третий вариант – использование
специализированных инструментов, направленных
на распределенное выполнение методов разрешения
сущностей над Hadoop [
        <xref ref-type="bibr" rid="ref30">30</xref>
        ].
5 Программирование операций
разрешения сущностей и слияния
данных на языке HIL
      </p>
      <p>
        Язык HIL (Highlevel Integration Language) [
        <xref ref-type="bibr" rid="ref28">28</xref>
        ],
новый специализированный язык, разработанный
IBM, ориентированный на разрешение и
интеграцию сущностей в Hadoop инфраструктуре.
      </p>
      <p>
        HIL компилируется в язык Jaql [
        <xref ref-type="bibr" rid="ref43 ref44">43, 44</xref>
        ], который
в свою очередь автоматически переписывается в
Map-Reduce, если этого требует алгоритм.
5.1 Реализация методов разрешения сущностей
Пусть даны структуры данных, включающие три
атрибута: id, value, name. Тогда простейшее правило
разрешения сущностей на языке HIL будет
выглядеть следующим образом:
declare Duplicated: ?;
declare Generated: ?;
declare Deduplicated: ?;
create link Deduplicated as
select
[gen: [id: g.id, name: g.name, value:
g.value],
dup: [id: d.id, name: d.name, value:
d.value]]
from Generated g, Duplicated d
match using
rule_id: g.id = d.id,
rule_name: g.name = d.name,
rule_value: g.value = d.value;
      </p>
      <p>В этом примере используется простое
сопоставление сущностей, по совпадению значений.
Если требуется ввести какую-то функцию меры для
значений, это можно реализовать внешней
функцией Jaql:
@jaql{
compareValue =
javaudf("org.ipiran.similarity.ValueSimil
arity");
}</p>
      <p>После этого такую функцию можно вызывать из
языка HIL:
declare compareValue: function ? to ?;
declare Duplicated: ?;
declare Generated: ?;
declare Deduplicated: ?;
create link Deduplicated as
select
[gen: [id: g.id, name: g.name, value:
g.value],
dup: [id: d.id, name: d.name, value:
d.value]]
from Generated g, Duplicated d
match using
rule_id:</p>
      <p>compareValue(g.id, d.id) &gt; 0.7,
rule_name:</p>
      <p>compareValue(g.name, d.name) &gt; 0.7,
rule_value:
compareValue(g.value, d.value) &gt; 0.7;
Можно также ввести меру для сравнения не
отдельных значений, а для сравнения объектов
целиком. Пусть описана функция compareObject,
которая принимает на вход объекты, тогда правило
на языке HIL изменится, т.к. в этом случае
используется другой вид правил:
insert into Deduplicated
select
[gen: [id: g.id, name: g.name, value:
g.value],
dup: [id: d.id, name: d.name, value:
d.value],
value: compareObject(g,d)]
from Generated g, Duplicated d
where compareObject(g, d) &gt; 0.7;</p>
      <p>Во всех этих случаях происходит сравнение всех
объектов со всеми, сложность подобного сравнения
O(n2). Несмотря на то, что сравнения будут
выполняться независимо и распределены на всех узлах
кластера (т.к. HIL переписывается в Jaql, а тот в свою
очередь в Map-Reduce), время их выполнения может
быть достаточно большим. Для уменьшения
количества сравнений, как было описано в четвертом
разделе, можно разбивать данные на блоки.</p>
      <p>Пусть имеется функция calcHash, которая
вычисляет hash для объектов. В результате функция
может выдавать столько уникальных значений, на
сколько блоков нам надо разбить данные. Тогда
объединив правила, рассмотренные выше, выбрав в
начале те объекты что совпадают по хэш функции, а
далее вычислив общую меру, можно получить
результат за более короткое время:
declare calcHash: function ? to ?;
insert into GeneratedHash
select [$.*, hash: calcHash($.*)]
from Generated;
insert into DuplicatedHash
select [$.*,hash: calcHash($.*)]
from Duplicated;
create link Deduplicated as
select [</p>
      <p>gen: [id: g.id, name: g.name, value:
g.value],</p>
      <p>dup: [id: d.id, name: d.name, value:
d.value]]
from GeneratedHash g, DuplicatedHash d
match using</p>
      <p>rule_id: g.hash = d.hash;
insert into Measured
select [gen: dd.gen, dup: dd.dup, value:
compareObject(dd.gen, dd.dup)]
from Deduplicated dd
where compareObject(dd.gen, dd.dup) &gt; 0.8
5.2 Реализация методов слияния данных
На данном этапе будем считать, что этап
разрешения сущностей уже пройден и нам дана
некоторая коллекция Deduplicated где уже
установлены соответствия одним из выше
перечисленных способов. Например, пусть у нас
есть две коллекции A (id, a, b, c) и B (id, a, b, d).
Атрибуты a, b, c, d могут содержать NULL значения,
атрибуты id совпадают. Ниже дан пример подобных
данных для коллекции А в формате JSON:
[{"a":null,"b":null,"c":"wmqhxfgmac","id"
:919132322},
{"a":null,"b":null,"c":"wmqhxfgmac","id":
919132322}]</p>
      <p>
        Тогда коллекция разрешенных сущностей может
быть получена следующим образом:
create link Deduplicated as
select
[gen: [id: a.id, a:a.a, b:a.b, c:a.c],
dup: [id: b.id, a:b.a, b:b.b, d:b.d]]
from A a, B b
match using
rule1: a.id = b.id;
Рассмотрим теперь реализацию Minimum Union
и Fusion оператор [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] на языке HIL.
      </p>
      <p>
        Как было описано в третьем разделе, Minimum
Union - это последовательное применение операций
outer union и subsumption [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ]. Outer Union
фактически реализуется с помощью индекса
FusionIndex. Использование индекса оправдано, т.к.
существует несколько записей, описывающих одну
сущность. Ключом является атрибут id. Ниже
представлена реализация операции Outer Union.
insert into FusionIndex![id: f.gen.id]
select [a: f.gen.a, b: f.gen.b, c:
f.gen.c] from Deduplicated f;
insert into FusionIndex![id: f.dup.id]
select [a: f.dup.a, b: f.dup.b, d:
f.dup.d] from Deduplicated f;
      </p>
      <p>Далее для реализации subsumption требуется
удалить все ненужные кортежи. Это делается на
языке Jaql. Для этого нужна функция, которая бы
определяла, поглощается ли один кортеж другим. К
сожалению, в языке Jaql нет возможностей
написания общих (generic) методов, универсальных
для всех коллекций, поэтому функцию сравнения
можно реализовать на java и подключить к языку
Jaql как демонстрировалось в разделе 5.1 на примере
функций вычисления меры. Либо же можно
реализовать функцию для сравнения конкретных
коллекций на языке Jaql, как показано ниже:
is_subsumed = fn(i,j) ((
isnull(j.a) or (i.a == j.a) ) and (
isnull(j.b) or (i.b == j.b) ) and (
isnull(j.c) or (i.c == j.c) ) and (
isnull(j.d) or (i.d == j.d) ) and (
i != j)) ;</p>
      <p>Функция is_subsumed(i,j) проверяет, поглощает
ли один кортеж другой кортеж при помощи
попарного сравнения атрибутов или проверки на
null.
removeSubsumed = fn (a) ( b = a,
subs = for (i0 in b) [a-&gt;filter
is_subsumed(i0,$)], s = subs -&gt; expand,
a -&gt; filter not $ in s);</p>
      <p>Функция removeSubsumed удаляет все
поглощенные записи из кортежа. Здесь реализован
наивный алгоритм, который попарно для каждого
кортежа находит все поглощенные им, и удаляет их.
minUnion = fn(id,a) ( {id:id, minunion :
removeSubsumed(a)});</p>
      <p>Функция minUnion нужна для построения
результирующих кортежей при реализации
Minimum Union.</p>
      <p>Теперь операцию Minumum Union можно
описать следующим образом на языке HIL:
insert into MinimumUnion
select minUnion(i.dup.id,</p>
      <p>FusionIndex![id : i.dup.id])
from Deduplicated i;</p>
      <p>Для каждого id достаются все соответствующие
записи и удаляются те, которые ими поглощаются.</p>
      <p>
        Data Fusion оператор [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] представляет собой
особый вид функции, использующий группировку
для преодоления конфликтов. Основная идея
заключается в группировке различных
представлений одной и той же сущности по общему
атрибуту, а затем в применении функций
разрешения конфликтов для всех остальных
атрибутов, сливая данные в одну сущность.
Различают два вида стратегии для функций
разрешения конфликтов:
      </p>
      <p> deciding-стратегия – заключается в выборе
какого-то одного значения каким-то способом
(минимум, максимум, случайное значение);
 mediating-стратегия – заключается в
агрегации всех значений (среднее значение, сумма).
Пусть имеются две коллекции A (id, name, age) и
B (id, name, info), пример которых дан ниже:
A
[{"id":760046903,"name":null,"age":null},
{"id":15009544,"name":
"zvqcsxkzxk","age":938781652}]
B
[{"id":15009544,"name":null,"info":null},
{"id":760046903,"name":"pjltaghyug","info
":null}]</p>
      <p>Пусть для них пройден этап разрешения
сущностей и построена коллекция Deduplicated как
описано выше в этом разделе. Пусть также для этих
данных построен индекс FusionIndex, как показано
выше для операции Minimum Union. Тогда Data
Fusion Оператор на языке HIL может быть описан
следующим образом:
@jaql{
average = fn($a) avg($a[*].age);
any = fn($a) any($a[*].name);
concat = fn ($a) strJoin($a[*].info,"_");
}
insert into Fused
select [
id : i.dup.id,
age:</p>
      <p>average(FusionIndex![id : i.dup.id]),
name:</p>
      <p>any(FusionIndex![id : i.dup.id]),
info:</p>
      <p>concat(FusionIndex![id: i.dup.id])]
from Deduplicated i;</p>
      <p>Функции вычисления среднего, выбора
случайного не-null значения, а также конкатенации
реализованы на Jaql. Данное правило образует
коллекцию Fused, причем для атрибута age будет
подсчитано среднее значение, для имени name
выбрано любое ненулевое значение, а для атрибута
info будет получена конкатенация всех доступных
значений. Таким образом, в данном примере
показана реализация обеих стратегий для функций
разрешения конфликтов в Data Fusion операторе.
6 Заключение</p>
      <p>Рассмотренные методы и операции извлечения и
интеграции информации о сущностях реального
мира позволяют программировать интеграционные
потоки вида ETL, образующие интегрированные
структурированные данные, которые могут быть
использованы в приложениях для дальнейшего
анализа и обработки. В статье рассмотрены методы
разрешения сущностей и слияния данных. В статье
показаны способы программирования методов и
операций извлечения и интеграции информации о
сущностях реального мира, включая методы
слияния данных на декларативном языке HIL.</p>
      <p>The paper is devoted to the problem of Entity
Resolution and Data Fusion implementation in the
context of big data integration. Entity resolution cares of
Duplicate Detection, Deduplication, Record Linkage,
Object Identification, Reference Matching, and other
ETL-related tasks. Data fusion is the final step in the
data integration process. This paper gives a short
overview of methods for entity resolution and data
fusion techniques. Then the paper presents the
techniques for programming of the entity resolution and
data fusion methods for implementing of the ETL
process in the Hadoop environment.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>LA</given-names>
            <surname>Adamic</surname>
          </string-name>
          ,
          <string-name>
            <given-names>E</given-names>
            <surname>Adar</surname>
          </string-name>
          .
          <article-title>Friends and neighbors on the Web</article-title>
          .
          <source>Social networks 25 (3)</source>
          ,
          <fpage>211</fpage>
          -
          <lpage>230</lpage>
          ,
          <issue>932</issue>
          ,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>Rohit</given-names>
            <surname>Ananthakrishna</surname>
          </string-name>
          et Al.,
          <article-title>Eliminating fuzzy Duplicates in data warehouses</article-title>
          ,
          <source>VLDB</source>
          <year>2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>A.</given-names>
            <surname>Arasu</surname>
          </string-name>
          et al.,
          <article-title>On active learning of record matching packages</article-title>
          ,
          <source>SIGMOD</source>
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>K.</given-names>
            <surname>Bellare</surname>
          </string-name>
          et al.,
          <article-title>Active sampling for entity matching</article-title>
          ,
          <source>KDD</source>
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>O.</given-names>
            <surname>Benjelloun</surname>
          </string-name>
          et al.,
          <article-title>Swoosh: A generic approach to Entity Resolution</article-title>
          , VLDBJ.
          <volume>18</volume>
          (
          <issue>1</issue>
          ),
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>I.</given-names>
            <surname>Bhattacharya</surname>
          </string-name>
          &amp; L.
          <string-name>
            <surname>Getoor</surname>
          </string-name>
          ,
          <article-title>Collective Entity Resolution in Relational Data</article-title>
          ,
          <string-name>
            <surname>TKDD</surname>
          </string-name>
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>I.</given-names>
            <surname>Bhattacharya</surname>
          </string-name>
          &amp; L.
          <string-name>
            <surname>Getoor</surname>
            ,
            <given-names>A Latent</given-names>
          </string-name>
          <string-name>
            <surname>Dirichlet</surname>
          </string-name>
          <article-title>Model for Unsupervised Entity Resolution</article-title>
          ,
          <string-name>
            <surname>SDM</surname>
          </string-name>
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>M.</given-names>
            <surname>Bilenko</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Mooney</surname>
          </string-name>
          , W. Cohen,
          <string-name>
            <given-names>P.</given-names>
            <surname>Ravikumar</surname>
          </string-name>
          , and
          <string-name>
            <given-names>S.</given-names>
            <surname>Fienberg</surname>
          </string-name>
          .
          <article-title>Adaptive name matching in information integration</article-title>
          .
          <source>IEEE Intelligent Systems</source>
          ,
          <volume>18</volume>
          (
          <issue>5</issue>
          ):
          <fpage>16</fpage>
          -
          <lpage>23</lpage>
          , Sep./Oct.
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>M.</given-names>
            <surname>Bilenko &amp; R. Mooney</surname>
          </string-name>
          ,
          <article-title>Adaptve Duplicate Detecton Using Learnable String Similarity Measures</article-title>
          ,
          <string-name>
            <surname>KDD</surname>
          </string-name>
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>J.</given-names>
            <surname>Bleiholder</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Naumann</surname>
          </string-name>
          .
          <source>Data Fusion. ACM Computing Survey</source>
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>J.</given-names>
            <surname>Bleiholder</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Naumann</surname>
          </string-name>
          . F.
          <article-title>Declarative data fusion - syntax, semantics, and implementation</article-title>
          .
          <source>In Proceedings of the East European Conference on Advances in Databases and Information Systems (ADBIS)</source>
          , p.
          <fpage>58</fpage>
          -
          <lpage>73</lpage>
          ,
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>J.</given-names>
            <surname>Bleiholder</surname>
          </string-name>
          .
          <source>Data Fusion and Conflict Resolution in Integrated Information Systems. Dissertation</source>
          ,
          <string-name>
            <surname>Hasso-</surname>
          </string-name>
          Plattner-Institut,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>P.</given-names>
            <surname>Bohannon</surname>
          </string-name>
          et al.,
          <article-title>Conditional Functional Dependencies for Data Cleaning</article-title>
          ,
          <string-name>
            <surname>ICDE</surname>
          </string-name>
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>M.</given-names>
            <surname>Broecheler</surname>
          </string-name>
          &amp; L.
          <string-name>
            <surname>Getoor</surname>
          </string-name>
          ,
          <article-title>Probabilistic Similarity Logic</article-title>
          ,
          <string-name>
            <surname>UAI</surname>
          </string-name>
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>Z.</given-names>
            <surname>Chen</surname>
          </string-name>
          et al.,
          <article-title>Exploiting context analysis for combining multiple entity resolution systems</article-title>
          ,
          <source>SIGMOD</source>
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>P.</given-names>
            <surname>Christen</surname>
          </string-name>
          ,
          <article-title>Automatic record linkage using seeded nearest neighbour and support vector machine classificaton</article-title>
          .,
          <string-name>
            <surname>KDD</surname>
          </string-name>
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>P.</given-names>
            <surname>Christen</surname>
          </string-name>
          .
          <article-title>Data Matching - Concepts and Techniques for Record Linkage</article-title>
          , Entity Resolution, and
          <string-name>
            <given-names>Duplicate</given-names>
            <surname>Detection</surname>
          </string-name>
          .
          <source>Data-Centric Systems and Applications</source>
          ,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <given-names>M.</given-names>
            <surname>Cochinwala</surname>
          </string-name>
          et al., “
          <article-title>Efficient data reconciliaton”</article-title>
          ,
          <source>Information Sciences</source>
          ,
          <year>2001</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <surname>A. Das Sarma</surname>
          </string-name>
          et al.,
          <article-title>“An Automatic Blocking Mechanism for Large-Scale De-duplication Tasks”</article-title>
          ,
          <string-name>
            <surname>CIKM</surname>
          </string-name>
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <string-name>
            <given-names>Jeffrey</given-names>
            <surname>Dean</surname>
          </string-name>
          and
          <string-name>
            <given-names>Sanjay</given-names>
            <surname>Ghemawat</surname>
          </string-name>
          .
          <source>MapReduce: Simplified Data Processing on Large Clusters. OSDI'04: Sixth Symposium on Operating System Design and Implementation</source>
          ,
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <string-name>
            <given-names>Xin</given-names>
            <surname>Luna</surname>
          </string-name>
          <string-name>
            <surname>Dong</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Felix</given-names>
            <surname>Naumann</surname>
          </string-name>
          .
          <article-title>Data Fusion - Resolving data conflicts in Integration</article-title>
          .
          <source>VLDB</source>
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [22]
          <string-name>
            <surname>Wenfei</surname>
            <given-names>Fan</given-names>
          </string-name>
          ,
          <string-name>
            <given-names>Floris</given-names>
            <surname>Geerts</surname>
          </string-name>
          .
          <source>Foundations of Data Quality Management. Synthesis Lectures on Data Management № 29</source>
          ,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [23]
          <string-name>
            <surname>Wenfei</surname>
            <given-names>Fan</given-names>
          </string-name>
          ,
          <article-title>Dependencies revisited for improving data quality</article-title>
          ,
          <source>PODS</source>
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          [24]
          <string-name>
            <surname>Fellegi</surname>
            , Ivan; Sunter,
            <given-names>Alan.</given-names>
          </string-name>
          <article-title>A Theory for Record Linkage</article-title>
          .
          <source>Journal of the American Statistical Association</source>
          <volume>64</volume>
          (
          <issue>328</issue>
          ): pp.
          <fpage>1183</fpage>
          -
          <lpage>1210</lpage>
          .
          <year>1969</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          [25]
          <string-name>
            <surname>Venkatesh</surname>
            <given-names>Ganti</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Anish Das Sarma. Data Cleaning</surname>
            ,
            <given-names>A Practical</given-names>
          </string-name>
          <string-name>
            <surname>Perspective</surname>
          </string-name>
          .
          <source>Synthesis Lectures on Data Management № 36</source>
          ,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>
          [26]
          <string-name>
            <surname>Lise</surname>
            <given-names>Getoor</given-names>
          </string-name>
          ,
          <string-name>
            <given-names>Ashwin</given-names>
            <surname>Machanavajjhala</surname>
          </string-name>
          .
          <article-title>Entity Resolution for Big Data</article-title>
          .
          <source>19th ACM SIGKDD Conference on Knowledge Discovery and Data Mining. Chicago: ACM SIGKDD</source>
          ,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref27">
        <mixed-citation>
          [27]
          <string-name>
            <given-names>R.</given-names>
            <surname>Gupta</surname>
          </string-name>
          &amp; S. Sarawagi,
          <source>Answering Table Augmentaton Queries from Unstructured Lists on the Web, PVLDB</source>
          <volume>2</volume>
          (
          <issue>1</issue>
          ),
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref28">
        <mixed-citation>
          [28]
          <string-name>
            <surname>Mauricio</surname>
            <given-names>Hernández</given-names>
          </string-name>
          , Georgia Koutrika, Rajasekar Krishnamurthy, Lucian Popa, Ryan Wisnesky.
          <article-title>HIL: a high-level scripting language for entity integration</article-title>
          .
          <source>EDBT'13 Proceedings of the 16th International Conference on Extending Database Technology. P. 549-560</source>
          ,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref29">
        <mixed-citation>
          [29]
          <string-name>
            <given-names>T.</given-names>
            <surname>Herzog</surname>
          </string-name>
          et al.,
          <source>Data Quality and Record Linkage Techniques</source>
          , Springer,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref30">
        <mixed-citation>
          [30]
          <string-name>
            <surname>Kolb</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          ;
          <string-name>
            <surname>Thor</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ;
          <string-name>
            <surname>Rahm</surname>
          </string-name>
          , E. Dedoop: Efficient Deduplication with
          <source>Hadoop Proc. 38th Intl. Conference on Very Large Databases (VLDB) / Proc. of the VLDB Endowment</source>
          <volume>5</volume>
          (
          <issue>12</issue>
          ),
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref31">
        <mixed-citation>
          [31]
          <string-name>
            <surname>Hanna</surname>
            <given-names>Köpcke</given-names>
          </string-name>
          , Andreas Thor,
          <string-name>
            <given-names>Erhard</given-names>
            <surname>Rahm</surname>
          </string-name>
          .
          <article-title>Evaluation of entity resolution approaches on realworld match problems</article-title>
          .
          <source>Proceedings of the VLDB Endowment</source>
          , Volume
          <volume>3</volume>
          ,
          <string-name>
            <surname>Issue</surname>
          </string-name>
          1-2,
          <year>September 2010</year>
          , P.
          <fpage>484</fpage>
          -
          <lpage>493</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref32">
        <mixed-citation>
          [32]
          <string-name>
            <surname>Hanna</surname>
            <given-names>Köpcke</given-names>
          </string-name>
          ,
          <string-name>
            <given-names>Erhard</given-names>
            <surname>Rahm</surname>
          </string-name>
          .
          <article-title>Frameworks for entity matching: A comparison</article-title>
          .
          <source>Data &amp; Knowledge Engineering</source>
          , Volume
          <volume>69</volume>
          ,
          <string-name>
            <surname>Issue</surname>
            <given-names>2</given-names>
          </string-name>
          ,
          <year>February 2010</year>
          . P.
          <volume>197</volume>
          -
          <fpage>210</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref33">
        <mixed-citation>
          [33]
          <string-name>
            <given-names>A.</given-names>
            <surname>Marcus</surname>
          </string-name>
          et al.
          <article-title>Human-powered Sorts and Joins</article-title>
          .
          <source>PVLDB</source>
          <volume>5</volume>
          (
          <issue>1</issue>
          ),
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref34">
        <mixed-citation>
          [34]
          <string-name>
            <surname>Felix</surname>
            <given-names>Naumann</given-names>
          </string-name>
          ,
          <string-name>
            <given-names>Melanie</given-names>
            <surname>Herschel</surname>
          </string-name>
          .
          <article-title>An Introduction to Duplicate Detection</article-title>
          .
          <source>Synthesis Lectures on Data Management. № 3</source>
          ,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref35">
        <mixed-citation>
          [35]
          <string-name>
            <given-names>G.</given-names>
            <surname>Papadias</surname>
          </string-name>
          et al.,
          <article-title>Beyond 100 million entities: large-scale blocking-based resoluton for heterogenous data</article-title>
          ,
          <source>WSDM</source>
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref36">
        <mixed-citation>
          [36]
          <string-name>
            <given-names>P.</given-names>
            <surname>Ravikumar</surname>
          </string-name>
          &amp; W. Cohen,
          <string-name>
            <given-names>A Hierarchical</given-names>
            <surname>Graphical</surname>
          </string-name>
          <article-title>Model for Record Linkage</article-title>
          ,
          <string-name>
            <surname>UAI</surname>
          </string-name>
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref37">
        <mixed-citation>
          [37]
          <string-name>
            <given-names>A.</given-names>
            <surname>Rajaraman</surname>
          </string-name>
          and
          <string-name>
            <given-names>J. D.</given-names>
            <surname>Ullman</surname>
          </string-name>
          .
          <article-title>Integrating information by outerjoins and full disjunctions</article-title>
          .
          <source>PODS1996.</source>
        </mixed-citation>
      </ref>
      <ref id="ref38">
        <mixed-citation>
          [38]
          <string-name>
            <given-names>S.</given-names>
            <surname>Sarawagi</surname>
          </string-name>
          et al.,
          <article-title>Interactive Deduplication using Active Learning</article-title>
          ,
          <string-name>
            <surname>KDD</surname>
          </string-name>
          <year>2000</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref39">
        <mixed-citation>
          [39]
          <string-name>
            <given-names>S.</given-names>
            <surname>Tejada</surname>
          </string-name>
          et al.,
          <article-title>Learning Object Identification Rules for Information Integration</article-title>
          ,
          <string-name>
            <surname>IS</surname>
          </string-name>
          <year>2001</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref40">
        <mixed-citation>
          [40]
          <string-name>
            <given-names>J.</given-names>
            <surname>Wang</surname>
          </string-name>
          et al.,
          <source>CrowdER: Crowdsourcing Entity Resolution, PVLDB</source>
          <volume>5</volume>
          (
          <issue>11</issue>
          ),
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref41">
        <mixed-citation>
          [41]
          <string-name>
            <given-names>Tom</given-names>
            <surname>White. Hadoop: The Definitive Guide. O'Reilly Media; Third Edition</surname>
          </string-name>
          .
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref42">
        <mixed-citation>
          [42]
          <string-name>
            <given-names>W.</given-names>
            <surname>Winkler</surname>
          </string-name>
          ,
          <source>Overview of Record Linkage and Current Research Directions, Research Report Series, US Census</source>
          ,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref43">
        <mixed-citation>
          [43]
          <string-name>
            <surname>Jaql</surname>
            <given-names>Overview</given-names>
          </string-name>
          :
          <article-title>Jaql, a query language for JavaScript Object Notation</article-title>
          (JSON),
          <year>2011</year>
          . https://code.google.com/p/jaql/wiki/JaqlOverview
        </mixed-citation>
      </ref>
      <ref id="ref44">
        <mixed-citation>
          [44]
          <string-name>
            <surname>IBM InfoSphere BigInsights</surname>
          </string-name>
          <article-title>Version 3</article-title>
          .0,
          <string-name>
            <surname>Jaql</surname>
            <given-names>reference.</given-names>
          </string-name>
          <year>2014</year>
          . http://www-01.ibm.com/support/ knowledgecenter/SSPT3X_3.0.0/ com.ibm.swg.im.infosphere.biginsights.jaql.doc/ doc/c0057749.html
        </mixed-citation>
      </ref>
      <ref id="ref45">
        <mixed-citation>
          <source>[45] Apache Hadoop 2.4.1</source>
          ,
          <year>2014</year>
          . http://hadoop.apache.org/
        </mixed-citation>
      </ref>
      <ref id="ref46">
        <mixed-citation>
          [46]
          <string-name>
            <given-names>MapReduce</given-names>
            <surname>Tutorial</surname>
          </string-name>
          ,
          <year>2013</year>
          . http://hadoop.apache.
          <source>org/docs/r1.2</source>
          .1/ mapred_tutorial.html
        </mixed-citation>
      </ref>
      <ref id="ref47">
        <mixed-citation>
          [47]
          <string-name>
            <given-names>Apache</given-names>
            <surname>Pig Project</surname>
          </string-name>
          ,
          <year>2014</year>
          http://pig.apache.org/
        </mixed-citation>
      </ref>
      <ref id="ref48">
        <mixed-citation>
          <source>[48] The Apache Hive data warehouse</source>
          ,
          <year>2014</year>
          . http://hive.apache.org/
        </mixed-citation>
      </ref>
      <ref id="ref49">
        <mixed-citation>
          [49]
          <article-title>Cosine similarity</article-title>
          . http://en.wikipedia.org/wiki/Cosine_similarity
        </mixed-citation>
      </ref>
      <ref id="ref50">
        <mixed-citation>
          [50]
          <string-name>
            <surname>Term</surname>
          </string-name>
          frequency
          <article-title>-inverse document frequency</article-title>
          . http://en.wikipedia.org/wiki/Tf%E2%
          <fpage>80</fpage>
          %
          <fpage>93idf</fpage>
        </mixed-citation>
      </ref>
      <ref id="ref51">
        <mixed-citation>
          [51]
          <string-name>
            <surname>Monge-Elkan Distance</surname>
          </string-name>
          Function. http://www.gabormelli.com/RKB/ Monge-Elkan_Distance_Function
        </mixed-citation>
      </ref>
      <ref id="ref52">
        <mixed-citation>
          [52]
          <article-title>String metric</article-title>
          . http://en.wikipedia.org/wiki/String_metric
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>