Этот пост посвящен использованию Apache Hive для запроса данных о кликах поиска, хранящихся в Hadoop. Мы возьмем примеры для генерации поискового запроса и статистики по количеству просмотров.
В продолжение предыдущих постов на
- Аналитические клики по продуктам поиска клиентов с использованием больших данных ,
- Flume: сбор данных о покупках по продуктам клиентов с использованием Apache Flume ,
у нас уже есть данные о кликах, полученных с помощью 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.
- Использование Свиньи для подсчета общего количества уникальных клиентов и т. Д.
Ссылка: | Hive. Запросите самый популярный поисковый запрос клиента и количество просмотров продукта с помощью Apache Hive от нашего партнера по JCG Яибира Малика из блога Jai . |