Набор данных о стоимости недвижимости в Великобритании
Набор содержит данные о стоимости недвижимости в Англии и Уэльсе. Данные доступны с 1995 года. Размер набора данных в несжатом виде составляет около 4 GiB, а в ClickHouse он займет около 278 MiB.
Источник: https://www.gov.uk/government/statistical-data-sets/price-paid-data-downloads Описание полей таблицы: https://www.gov.uk/guidance/about-the-price-paid-data
Набор содержит данные HM Land Registry data © Crown copyright and database right 2021. Эти данные лицензированы в соответствии с Open Government Licence v3.0.
Загрузите набор данных
Выполните команду:
wget http://prod.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-complete.csv
Загрузка займет около 2 минут при хорошем подключении к интернету.
Создайте таблицу
CREATE TABLE uk_price_paid
(
price UInt32,
date Date,
postcode1 LowCardinality(String),
postcode2 LowCardinality(String),
type Enum8('terraced' = 1, 'semi-detached' = 2, 'detached' = 3, 'flat' = 4, 'other' = 0),
is_new UInt8,
duration Enum8('freehold' = 1, 'leasehold' = 2, 'unknown' = 0),
addr1 String,
addr2 String,
street LowCardinality(String),
locality LowCardinality(String),
town LowCardinality(String),
district LowCardinality(String),
county LowCardinality(String),
category UInt8
) ENGINE = MergeTree ORDER BY (postcode1, postcode2, addr1, addr2);
Обработайте и импортируйте данные
В этом примере используется clickhouse-local
для предварительной обработки данных и clickhouse-client
для импорта данных.
Указывается структура исходных данных CSV-файла и запрос для предварительной обработки данных с помощью clickhouse-local
.
Предварительная обработка включает:
- разделение почтового индекса на два разных столбца
postcode1
иpostcode2
, что лучше подходит для хранения данных и выполнения запросов к ним; - преобразование поля
time
в дату, поскольку оно содержит только время 00:00; - поле UUid игнорируется, потому что оно не будет использовано для анализа;
- преобразование полей
type
иduration
в более читаемые поля типаEnum
с помощью функции transform; - преобразование полей
is_new
иcategory
из односимвольной строки (Y
/N
иA
/B
) в поле UInt8 со значениями 0 и 1 соответственно.
Обработанные данные передаются в clickhouse-client
и импортируются в таблицу ClickHouse потоковым способом.
clickhouse-local --input-format CSV --structure '
uuid String,
price UInt32,
time DateTime,
postcode String,
a String,
b String,
c String,
addr1 String,
addr2 String,
street String,
locality String,
town String,
district String,
county String,
d String,
e String
' --query "
WITH splitByChar(' ', postcode) AS p
SELECT
price,
toDate(time) AS date,
p[1] AS postcode1,
p[2] AS postcode2,
transform(a, ['T', 'S', 'D', 'F', 'O'], ['terraced', 'semi-detached', 'detached', 'flat', 'other']) AS type,
b = 'Y' AS is_new,
transform(c, ['F', 'L', 'U'], ['freehold', 'leasehold', 'unknown']) AS duration,
addr1,
addr2,
street,
locality,
town,
district,
county,
d = 'B' AS category
FROM table" --date_time_input_format best_effort < pp-complete.csv | clickhouse-client --query "INSERT INTO uk_price_paid FORMAT TSV"
Выполнение запроса займет около 40 секунд.
Проверьте импортированные данные
Запрос:
SELECT count() FROM uk_price_paid;
Результат:
┌──count()─┐
│ 26321785 │
└──────────┘
Размер набора данных в ClickHouse составляет всего 278 MiB, проверьте это.
Запрос:
SELECT formatReadableSize(total_bytes) FROM system.tables WHERE name = 'uk_price_paid';
Результат:
┌─formatReadableSize(total_bytes)─┐
│ 278.80 MiB │
└─────────────────────────────────┘