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

Сегодня я расскажу, как затратив минимум усилий при работе с большими данными, справиться с задачей создания таблиц с нужными параметрами, а также, как удалить сразу большое количество потерявших актуальность таблиц.

Текущую деятельность уже невозможно представить без использования больших данных. Предлагаю рассмотреть некоторые методы оптимизации своих усилий в работе с большими данными при решении задач создания и удаления таблиц. Но для начала разберемся в терминах.

Apache Hadoop – это пакет утилит, библиотек и фреймворков, его используют для построения систем, которые работают с Big Data. Он позволяет хранить и обрабатывать данные для выгрузки в другие сервисы.

Hive – система хранения данных, которая помогает запрашивать большие наборы данных в HDFS, использует HQL (Hive Query Language) – язык запросов Hive. Для того чтобы использовать данные выборок Apache Hadoop для дальнейшей их обработки и анализа, можно сохранять их в свои пользовательские таблицы. Существует несколько способов создания таблиц. Самый «лёгкий» способ сохранить данные — написать в Hive QL запрос:

Create table database_lab.mytable as
Select a.* from databasename.tablename a;

Здесь и далее указан «простой select», но в вашем случае это может быть сложный запрос с большим количеством таблиц (с использованием join). Выбираем таблицу, структуру которой хотим воссоздать. Данный способ нежелателен, так как таблица будет создаваться в процессе запроса. Другой способ – создать совсем новую таблицу:

Create table database_lab.mytable (column1 string, column2 bigint,……. , columnN int);

После этого уже можно будет заливать выбранные данные в готовую таблицу:

Insert into   database_lab.mytable  
Select a.* from databasename.tablename a;

В данном методе самой трудоёмкой задачей является описание полей и их типа данных. Для решения этой задачи я предлагаю использовать PySpark. Запускаю пользовательскую сессию PySpark с помощью Jupyter NoteBook. Устанавливаю конфигурацию параметров SparkContext и подключаюсь к Apache Hadoop c использованием PySpark:

import os 
import sys 
from PySpark import SparkConf
from PySpark.sql  import HiveContext, SQLContext 
conf = SparkConf().setAppName('Create Drop Table').setMaster('yarn') conf.setAll([ ## здесь ваши настройки ]) 
spark = SparkSession.builder.config(conf=conf).enableHiveSupport().getOrCreate() 
hivecontext = HiveContext(spark) 
sqlContext =SQLContext(hivecontext)

Следующий шаг – напишу запрос, с помощью которого получаю данные для анализа:

query = “Select a.* from databasename.tablename a”

Создаю spark DataFrame, эта операция не нагружает систему, так как фактически к данным обращения нет:

df_sql = sqlContext.sql(query)

Набираю следующую команду:

df_sql
DataFrame[column1 : string, column2:  bigint,……. , columnN : int]

Видим практически готовую структуру для создания таблицы. Сделаю несколько преобразований и получаю готовый скрипт для создания пустой таблицы:

# возьмём это значение и преобразуем в строку
df_sq_str = str(df_sql)
df_sq_str    
‘DataFrame[column1 : string, column2:  bigint,……. , columnN : int]’
# заменим значения “DataFrame[, ], :”
columns_table = df_sq_str.replace(‘DataFrame[’,’’) .replace(‘]’,’’) .replace(‘:’,’’)
# напишем команду запроса для создания таблицы
hql_create_table = ‘Create table database_lab.mytable ’  + ‘(‘ + columns_table + ‘)’
hql_create_table
‘Create table database_lab.mytable (column1 string, column2 bigint,……. , columnN int)’

На последнем этапе запускаю готовую команду. Это можно осуществить как в PySpark, так и в Hive.

Рано или поздно наступает момент, когда данные таблиц уже использованы и потеряли свою актуальность. Рассмотрим, как удалить свои таблицы с неактуальными данными. Если у вас не так много таблиц в Hadoop, то проблем с удалением не возникает.

Набираю в Hive QL:

Drop table database_lab.mytable;

Однако, когда их больше 1000, и кроме ваших таблиц есть таблицы других пользователей, то возникает вопрос как быстро удалить уже ненужные вам таблицы. Для этого необходимо при создании таблиц стандартизировать их название. Например:

tmp_IvanovVS_kreditfl_2022_08_08_1

где:

tmp – временная (промежуточная),

IvanovVS – идентификатор принадлежности,

kreditfl – тип данных,

2022_08_08 – дата создания,

1 – номер таблицы, если их больше 1.

Для удаления таблиц снова воспользуюсь возможностями PySpark. Запускаю пользовательскую сессию PySpark с помощью Jupyter NoteBook, устанавливаю конфигурацию параметров SparkContext и подключаюсь к Apache Hadoop c использованием PySpark как указано выше. Создаю Spark DataFrame таблиц базы данных:

df_table_list = spark.sql(“””show tables in database_lab”””)
#Выберем списком названия таблиц
tables_all = [row.tablename for row in df_table_list]
#создадим список моих таблиц
tables_me = []
for table_name in tables_all:
    if ‘IvanovVS’ in   table_name:
	tables_me.append(table_name)

Теперь можно удалить все таблицы:

for table_name in tables_me:
    query =”drop table database_lab.” +   table_name
    df_drop_table = sqlContext.sql(query)
    print(‘Удалена таблица {0}’.format(table_name))

Таким образом будут удалены все ваши таблицы. Можно также выбирать таблицы для удаления с помощью дополнительных параметров, заложенных в названии таблиц.

В результате, используя предложенные методы PySpark, можно значительно упростить работу по созданию и удалению собственных таблиц в Apache Hadoop.