这些数据包含英格兰和威尔士房地产的成交价格。该数据自 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 数据 © Crown copyright and database right 2021。该数据依据 Open Government Licence v3.0 许可。
创建表
CREATE DATABASE uk;
CREATE TABLE uk.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)
)
ENGINE = MergeTree
ORDER BY (postcode1, postcode2, addr1, addr2);预处理并插入数据
我们将使用 url 函数将数据流式导入 ClickHouse。首先需要对部分传入的数据进行预处理,包括:
- 将
postcode拆分为两个不同的列——postcode1和postcode2,这样更利于存储和查询 - 将
time字段转换为日期,因为它只包含 00:00 时间 - 忽略 UUid 字段,因为分析时不需要它
- 使用 transform 函数将
type和duration转换为更易读的Enum字段 - 将
is_new字段从单字符字符串 (Y/N) 转换为取值为 0 或 1 的 UInt8 字段 - 删除最后两列,因为它们的值都相同 (均为 0)
url 函数会将数据从 Web 服务器流式导入你的 ClickHouse 表。以下命令会向 uk_price_paid 表插入 500 万行:
INSERT INTO uk.uk_price_paid
SELECT
toUInt32(price_string) AS price,
parseDateTimeBestEffortUS(time) AS date,
splitByChar(' ', postcode)[1] AS postcode1,
splitByChar(' ', postcode)[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
FROM url(
'http://prod1.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-complete.csv',
'CSV',
'uuid_string String,
price_string String,
time String,
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'
) SETTINGS max_http_get_redirects=10;等待数据完成插入——根据网络速度,这可能需要一到两分钟。
验证数据
我们可以通过查看插入了多少行来确认是否成功:
SELECT count()
FROM uk.uk_price_paid执行此查询时,该数据集有 27,450,499 行。再来看看 ClickHouse 中这张表占用了多少存储空间:
SELECT formatReadableSize(total_bytes)
FROM system.tables
WHERE name = 'uk_price_paid'可以看到,这张表的大小仅为 221.43 MiB!
执行一些查询
执行一些查询来分析数据:
查询 1:每年的平均价格
SELECT
toYear(date) AS year,
round(avg(price)) AS price,
bar(price, 0, 1000000, 80
)
FROM uk.uk_price_paid
GROUP BY year
ORDER BY year查询 2:伦敦每年的平均房价
SELECT
toYear(date) AS year,
round(avg(price)) AS price,
bar(price, 0, 2000000, 100
)
FROM uk.uk_price_paid
WHERE town = 'LONDON'
GROUP BY year
ORDER BY year2020 年的房价似乎发生了一些变化!不过这大概也不让人意外……
查询 3. 房价最高的街区
SELECT
town,
district,
count() AS c,
round(avg(price)) AS price,
bar(price, 0, 5000000, 100)
FROM uk.uk_price_paid
WHERE date >= '2020-01-01'
GROUP BY
town,
district
HAVING c >= 100
ORDER BY price DESC
LIMIT 100使用投影加速查询
我们可以用投影来加速这些查询。有关此数据集的示例,请参阅"投影"。
在 Playground 中试用
该数据集也可在在线 Playground中使用。