Время прочтения: 3 мин.

При работе с большими данными каждый аналитик хочет, чтобы запросы в базы данных выполнялись мгновенно, ну или хотя бы просто быстро. Именно для такой скоростной обработки массивных запросов я познакомился с Apache Hive (Система управления базами данных на основе платформы Hadoop. Позволяет выполнять запросы, агрегировать и анализировать данные, хранящиеся в Hadoop).

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

В самом начале работы с Hive, я столкнулся с проблемой выгрузки данных в MS Excel или CSV, т.к. в Hive было установлено ограничение по выгрузке таблиц не более 100 тыс. строк.

Так как же выгрузить таблицу более 100 тыс. строк быстро?

Я расскажу, как это можно сделать через Apache Beeline и File Browser.

Apache Beeline.

Для выгрузки данных через Apache Beeline необходимо подключиться к серверу по SSH, к примеру, через WinSCP или Python.

Алгоритм выгрузки через WinSCP.

  1. Подключаемся к серверу через WinSCP
  1. Через терминал запускаем команду (для запуска из команды необходимо убрать все «\n»):

«delimiterForDSV=’;’» — разделитель для CSV;

«outputformat=dsv» — формат выгружаемых данных;

«-e “ваш запрос”» — запрос в базу данных.

beeline -u 'jdbc:hive2://fauna647.cloud.df.sbrf.ru:10000/default;
principal=hive/_HOST@DF.SBRF.RU'
--incremental=true --incrementalBufferRows=1000 --showHeader=true 
--outputformat=dsv --delimiterForDSV=';'
-e "
SELECT *
  FROM internal_friendface_smadmin.incidentsm1
 LIMIT 100;
" > /home/vitkovay_hq-szb-sbrf-ru/Query.csv

3. После выполнения команды, результат выгрузки будет сохранен на сервере в файл «Query.csv»

Алгоритм выгрузки через Python.

  1. Подключаемся к серверу через модуль paramiko в Python
import paramiko

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('fauna648.cloud.df.sbrf.ru',
                username='username',
                password='password')

2. Подготавливаем наш запрос и команду для paramiko

bash = '''
beeline -u 'jdbc:hive2://fauna647.cloud.df.sbrf.ru:10000/default;
principal=hive/_HOST@DF.SBRF.RU'
--incremental=true --incrementalBufferRows=1000 --showHeader=true --outputformat=dsv --delimiterForDSV=';'
-e "
SELECT *
  FROM internal_friendface_smadmin.incidentsm1
 LIMIT 100;
" > /home/vitkovay_hq-szb-sbrf-ru/Query.csv
'''
bash = bash.replace('\n', ' ')

3. Запускаем команду с помощью «open_sftp()» сохраняем результаты запроса на локальном компьютере.

stdin, stdout, stderr = client.exec_command(bash)

sftp = client.open_sftp()
sftp.get('/home/vitkovay_hq-szb-sbrf-ru/Query.csv', 'Query.csv')
sftp.close()

Результат выполнения запроса будет сохранен в файл «Query.csv»

File Browser.

Для выгрузки через File Browser нам понадобятся права на создание таблиц.

  1. Устанавливаем параметры создания таблицы, которые помогут нам объединить все партиции исходных таблиц в один файл для выгрузки
SET hive.merge.mapfiles=true;
SET hive.merge.mapredfiles=true;
SET hive.merge.smallfiles.avgsize=16000000;
SET hive.merge.size.per.task=2256000000;
SET hive.merge.tezfiles=true;

2. Подготавливаем запрос и создаем таблицу, которую надо выгрузить в файл

CREATE TABLE team_sva_audit.table_with_data
STORED AS TEXTFILE
AS
SELECT * 
  FROM internal_friendface_smadmin.incidentsm1  
 LIMIT 100;

3. После отработки запроса заходим в раздел информации по таблице и «проваливаемся» в «Location». Отсюда можно скачать файл с данными

Итак, я вам показал несколько способов выгрузки таблиц размером более 100 тыс. срок из Apache Hive с использованием нескольких инструментов, а именно с помощью WinSCP и Python. Дальше уже эти данные можно использовать для построения моделей машинного обучения и проведения Process Mining.