Статьи

Hive. Запросите самый популярный поисковый запрос клиента и количество просмотров продукта с помощью Apache Hive.

Этот пост посвящен использованию Apache Hive для запроса данных о кликах поиска, хранящихся в Hadoop. Мы возьмем примеры для генерации поискового запроса и статистики по количеству просмотров.

В продолжение предыдущих постов на

у нас уже есть данные о кликах, полученных с помощью Flume в Hadoop HDFS.

Здесь будет проведен дальнейший анализ использования Hive для запроса сохраненных данных в Hadoop.

улей

Hive позволяет нам запрашивать большие данные, используя SQL-подобный язык HiveQL.

Улей-запрос-поиск-событие

Данные Hadoop

Как сообщалось в последнем сообщении, у нас есть данные по поисковым кликам, хранящиеся в hadoop в следующем формате «/ searchevents / 2014/05/15/16 /». Данные хранятся в отдельном каталоге, созданном за час.

Файлы создаются как:

1
hdfs://localhost.localdomain:54321/searchevents/2014/05/06/16/searchevents.1399386809864

Данные хранятся как DataSteam:

1
2
{"eventid":"e8470a00-c869-4a90-89f2-f550522f8f52-1399386809212-72","hostedmachinename":"192.168.182.1334","pageurl":"http://jaibigdata.com/0","customerid":72,"sessionid":"7871a55c-a950-4394-bf5f-d2179a553575","querystring":null,"sortorder":"desc","pagenumber":0,"totalhits":8,"hitsshown":44,"createdtimestampinmillis":1399386809212,"clickeddocid":"23","favourite":null,"eventidsuffix":"e8470a00-c869-4a90-89f2-f550522f8f52","filters":[{"code":"searchfacettype_brand_level_2","value":"Apple"},{"code":"searchfacettype_color_level_2","value":"Blue"}]}
{"eventid":"2a4c1e1b-d2c9-4fe2-b38d-9b7d32feb4e0-1399386809743-61","hostedmachinename":"192.168.182.1330","pageurl":"http://jaibigdata.com/0","customerid":61,"sessionid":"78286f6d-cc1e-489c-85ce-a7de8419d628","querystring":"queryString59","sortorder":"asc","pagenumber":3,"totalhits":32,"hitsshown":9,"createdtimestampinmillis":1399386809743,"clickeddocid":null,"favourite":null,"eventidsuffix":"2a4c1e1b-d2c9-4fe2-b38d-9b7d32feb4e0","filters":[{"code":"searchfacettype_age_level_2","value":"0-12 years"}]}

Spring Data

Мы будем использовать Spring для Apache Hadoop, чтобы запускать задания кустов с помощью Spring. Чтобы настроить среду куста в вашем приложении, используйте следующие конфигурации:

01
02
03
04
05
06
07
08
09
10
11
<hdp:configuration id="hadoopConfiguration"
        resources="core-site.xml">
        fs.default.name=hdfs://localhost.localdomain:54321
        mapred.job.tracker=localhost.localdomain:54310
</hdp:configuration>
<hdp:hive-server auto-startup="true" port="10234" min-threads="3" id="hiveServer" configuration-ref="hadoopConfiguration">
</hdp:hive-server>
<hdp:hive-client-factory id="hiveClientFactory" host="localhost" port="10234">
</hdp:hive-client-factory>
<hdp:hive-runner id="hiveRunner" run-at-startup="false" hive-client-factory-ref="hiveClientFactory">
</hdp:hive-runner>

Проверьте файл контекста весны applicationContext -asticsearch.xml для получения дополнительной информации. Мы будем использовать hiveRunner для запуска скриптов улья.

Все скрипты куста в приложении находятся в папке ресурсов куста .
Сервис для запуска всех скриптов кустов можно найти по адресу HiveSearchClicksServiceImpl.java

Настройка базы данных

Давайте настроим базу данных для запроса данных в первую очередь.

1
2
DROP DATABASE IF EXISTS search CASCADE;
CREATE DATABASE search;

Запросить события поиска с использованием внешней таблицы

Мы создадим Внешнюю таблицу search_clicks для чтения данных поисковых событий, хранящихся в hadoop.

1
2
USE search;
CREATE EXTERNAL TABLE IF NOT EXISTS search_clicks (eventid String, customerid BIGINT, hostedmachinename STRING, pageurl STRING, totalhits INT, querystring STRING, sessionid STRING, sortorder STRING, pagenumber INT, hitsshown INT, clickeddocid STRING, filters ARRAY<STRUCT<code:STRING, value:STRING>>, createdtimestampinmillis BIGINT) PARTITIONED BY (year STRING, month STRING, day STRING, hour STRING) ROW FORMAT SERDE 'org.jai.hive.serde.JSONSerDe' LOCATION 'hdfs:///searchevents/';

JSONSerDe

Пользовательский SerDe «org.jai.hive.serde.JSONSerDe» используется для сопоставления данных JSON. Проверьте более подробную информацию о том же JSONSerDe.java

Если вы выполняете запросы из самого Eclipse, зависимости будут автоматически разрешены. Если вы работаете с консоли куста, убедитесь, что для создания класса jar-файла добавьте соответствующую зависимость к консоли улья, прежде чем выполнять запросы куста.

1
2
3
4
5
6
7
8
9
#create hive json serde jar
jar cf jaihivejsonserde-1.0.jar org/jai/hive/serde/JSONSerDe.class
# run on hive console to add jar
add jar /opt/hive/lib/jaihivejsonserde-1.0.jar;
# Or add jar path to hive-site.xml file permanently
<property>
        <name>hive.aux.jars.path</name>
        <value>/opt/hive/lib/jaihivejsonserde-1.0.jar</value>
</property>

Создать раздел улья

Мы будем использовать стратегию разделов кустов для чтения данных, хранящихся в hadoop в иерархических положениях. Исходя из указанного выше местоположения «/ searchevents / 2014/05/06/16 /», мы передадим следующие значения параметров (DBNAME = search, TBNAME = search_clicks, YEAR = 2014, MONTH = 05, DAY = 06, HOUR = 16).

1
2
USE ${hiveconf:DBNAME};
ALTER TABLE ${hiveconf:TBNAME} ADD IF NOT EXISTS PARTITION(year='${hiveconf:YEAR}', month='${hiveconf:MONTH}', day='${hiveconf:DAY}', hour='${hiveconf:HOUR}') LOCATION "hdfs:///searchevents/${hiveconf:YEAR}/${hiveconf:MONTH}/${hiveconf:DAY}/${hiveconf:HOUR}/";

Чтобы запустить скрипт,

01
02
03
04
05
06
07
08
09
10
11
12
Collection<HiveScript> scripts = new ArrayList<>();
            Map<String, String> args = new HashMap<>();
            args.put("DBNAME", dbName);
            args.put("TBNAME", tbName);
            args.put("YEAR", year);
            args.put("MONTH", month);
            args.put("DAY", day);
            args.put("HOUR", hour);
            HiveScript script = new HiveScript(new ClassPathResource("hive/add_partition_searchevents.q"), args);
            scripts.add(script);
            hiveRunner.setScripts(scripts);
            hiveRunner.call();

В следующем посте мы расскажем, как использовать задание координатора Oozie для автоматического создания разделов улья для почасовых данных.

Получить все Поиск Нажмите События

Получить поисковые события, хранящиеся во внешней таблице search_clicks. Передайте следующие значения параметров (DBNAME = search, TBNAME = search_clicks, YEAR = 2014, MONTH = 05, DAY = 06, HOUR = 16).

1
2
USE ${hiveconf:DBNAME};
select eventid, customerid, querystring, filters from ${hiveconf:TBNAME} where year='${hiveconf:YEAR}' and month='${hiveconf:MONTH}' and day='${hiveconf:DAY}' and hour='${hiveconf:HOUR}';

Это вернет вам все данные в указанном месте, а также поможет вам проверить ваш пользовательский SerDe.

Найти виды товаров за последние 30 дней

Сколько раз продукт был просмотрен / кликнул за последние n дней.

1
2
3
4
5
Use search;
DROP TABLE IF EXISTS search_productviews;
CREATE TABLE search_productviews(id STRING, productid BIGINT, viewcount INT);
-- product views count in the last 30 days.
INSERT INTO TABLE search_productviews select clickeddocid as id, clickeddocid as productid, count(*) as viewcount from search_clicks where clickeddocid is not null and createdTimeStampInMillis > ((unix_timestamp() * 1000) - 2592000000) group by clickeddocid order by productid;

Чтобы запустить скрипт,

1
2
3
4
5
Collection<HiveScript> scripts = new ArrayList<>();
            HiveScript script = new HiveScript(new ClassPathResource("hive/load-search_productviews-table.q"));
            scripts.add(script);
            hiveRunner.setScripts(scripts);
            hiveRunner.call();

Пример данных, выберите данные из таблицы «search_productviews».

1
2
3
4
5
# id, productid, viewcount
61, 61, 15
48, 48, 8
16, 16, 40
85, 85, 7

Найти самые популярные запросы Cutomer за последние 30 дней

1
2
3
4
5
Use search;
DROP TABLE IF EXISTS search_customerquery;
CREATE TABLE search_customerquery(id String, customerid BIGINT, querystring String, querycount INT);
-- customer top query string in the last 30 days
INSERT INTO TABLE search_customerquery select concat(customerid,"_",queryString), customerid, querystring, count(*) as querycount from search_clicks where querystring is not null and customerid is not null and createdTimeStampInMillis > ((unix_timestamp() * 1000) - 2592000000) group by customerid, querystring order by customerid;

Пример данных, выберите данные из таблицы «search_customerquery».

1
2
3
4
5
# id, querystring, count, customerid
61_queryString59, queryString59, 5, 61
298_queryString48, queryString48, 3, 298
440_queryString16, queryString16, 1, 440
47_queryString85, queryString85, 1, 47

Анализ граней / фильтров для управляемой навигации

Вы можете дополнительно расширить запросы Hive, чтобы сгенерировать статистику поведения конечных клиентов в течение определенного периода времени, используя фасет / фильтры для поиска соответствующего продукта.

1
2
3
4
5
6
7
USE search;
-- How many times a particular filter has been clicked.
select count(*) from search_clicks where array_contains(filters, struct("searchfacettype_color_level_2", "Blue"));
-- how many distinct customer clicked the filter
select DISTINCT customerid from search_clicks where array_contains(filters, struct("searchfacettype_color_level_2", "Blue"));
-- top query filters by a customer
select customerid, filters.code, filters.value, count(*) as filtercount from search_clicks group by customerid, filters.code, filters.value order by filtercount DESC limit 100;

Запросы Hive для извлечения данных могут планироваться на еженедельной / почасовой основе в зависимости от требований и могут выполняться с использованием планировщика заданий, такого как Oozie. Данные могут в дальнейшем использоваться для аналитики BI или улучшения качества обслуживания клиентов.

В последующих постах мы рассмотрим, чтобы проанализировать полученные данные дальше,

  • Использование ElasticSearch Hadoop для индексации самых популярных запросов клиентов и данных о продуктах
  • Использование Oozie для планирования согласованных заданий для раздела куста и связывания заданий для индексации данных в ElasticSearch.
  • Использование Свиньи для подсчета общего количества уникальных клиентов и т. Д.