Как хранить исторические данные более эффективно

Более эффективное хранение исторических данных

Практическое пособие по использованию PySpark для хранения только 0.01% строк DataFrame без потери какой-либо информации.

Фото от Supratik Deshmukh на Unsplash

В эпоху, когда компании и организации собирают больше данных, чем когда-либо ранее, наборы данных склонны накапливать миллионы ненужных строк, которые не содержат никакой новой или ценной информации. В этой статье мы сосредоточимся на важном аспекте управления данными: удалении строк в наборе данных, если они не предоставляют никакой добавленной ценности, с использованием PySpark*.

*PySpark используется вместо pandas при работе с очень большими наборами данных, потому что он может обрабатывать данные на нескольких компьютерах, что делает его быстрее и масштабируемым. Pandas хорошо работает с меньшими наборами данных, которые могут поместиться в память на одном компьютере, но может становиться медленным или даже непрактичным для больших данных.

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

В этом наборе данных присутствуют три столбца:

  • id -> для идентификатора здания.
  • condition -> целое число от 1 (ужасное) до 10 (отличное), которое представляет состояние здания.
  • import_date -> столбец с датой и временем, представляющий день, когда эта строка была импортирована из внешнего программного обеспечения.

Чтобы создать этот набор данных самостоятельно, выполните следующий код:

from pyspark.sql import SparkSession, Rowfrom pyspark.sql.functions as ffrom pyspark.sql.types import IntegerType, DateTypeimport random# задайте seed, чтобы получить одинаковые результаты при повторном выполненииrandom.seed(42)# создайте сеанс Sparkspark = SparkSession.builder.getOrCreate()# создайте список идентификаторовids = list(range(1, 11))  # Измените размер этого списка, чтобы получить нужное количество уникальных идентификаторов# создайте два возможных состояния для каждого идентификатораconditions = [[random.randint(1, 10) for _ in range(2)] for _ in ids]# создайте список кортежей, где каждый кортеж является строкойrows = [(id, random.choice(conditions[id-1]), date)         for id in ids…