mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-14 18:32:29 +00:00
174 lines
8.3 KiB
Markdown
174 lines
8.3 KiB
Markdown
|
---
|
|||
|
slug: /ja/getting-started/example-datasets/environmental-sensors
|
|||
|
sidebar_label: 環境センサーのデータ
|
|||
|
---
|
|||
|
|
|||
|
# 環境センサーのデータ
|
|||
|
|
|||
|
[Sensor.Community](https://sensor.community/en/) は、オープン環境データを生成する共同作業型グローバルセンサーネットワークです。このデータは、世界中のセンサーから収集されています。誰でもセンサーを購入して、好きな場所に設置することができます。データをダウンロードするためのAPIは [GitHub](https://github.com/opendata-stuttgart/meta/wiki/APIs) にあり、データは [Database Contents License (DbCL)](https://opendatacommons.org/licenses/dbcl/1-0/) の下で自由に利用可能です。
|
|||
|
|
|||
|
:::important
|
|||
|
このデータセットには200億以上のレコードがあるため、以下のコマンドを単純にコピー&ペーストする場合は、リソースがこのボリュームに耐えられるか注意が必要です。以下のコマンドは、[ClickHouse Cloud](https://clickhouse.cloud) の**本番**インスタンスで実行されています。
|
|||
|
:::
|
|||
|
|
|||
|
1. データはS3にあるので、`s3`テーブル関数を使用してファイルからテーブルを作成できます。また、データをそのままクエリすることもできます。ClickHouseに挿入する前にいくつかの行を見てみましょう:
|
|||
|
|
|||
|
```sql
|
|||
|
SELECT *
|
|||
|
FROM s3(
|
|||
|
'https://clickhouse-public-datasets.s3.eu-central-1.amazonaws.com/sensors/monthly/2019-06_bmp180.csv.zst',
|
|||
|
'CSVWithNames'
|
|||
|
)
|
|||
|
LIMIT 10
|
|||
|
SETTINGS format_csv_delimiter = ';';
|
|||
|
```
|
|||
|
|
|||
|
データはCSVファイルにあり、デリミタとしてセミコロンを使用しています。行の形式は次のようになっています:
|
|||
|
|
|||
|
```response
|
|||
|
┌─sensor_id─┬─sensor_type─┬─location─┬────lat─┬────lon─┬─timestamp───────────┬──pressure─┬─altitude─┬─pressure_sealevel─┬─temperature─┐
|
|||
|
│ 9119 │ BMP180 │ 4594 │ 50.994 │ 7.126 │ 2019-06-01T00:00:00 │ 101471 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 19.9 │
|
|||
|
│ 21210 │ BMP180 │ 10762 │ 42.206 │ 25.326 │ 2019-06-01T00:00:00 │ 99525 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 19.3 │
|
|||
|
│ 19660 │ BMP180 │ 9978 │ 52.434 │ 17.056 │ 2019-06-01T00:00:04 │ 101570 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 15.3 │
|
|||
|
│ 12126 │ BMP180 │ 6126 │ 57.908 │ 16.49 │ 2019-06-01T00:00:05 │ 101802.56 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 8.07 │
|
|||
|
│ 15845 │ BMP180 │ 8022 │ 52.498 │ 13.466 │ 2019-06-01T00:00:05 │ 101878 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 23 │
|
|||
|
│ 16415 │ BMP180 │ 8316 │ 49.312 │ 6.744 │ 2019-06-01T00:00:06 │ 100176 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 14.7 │
|
|||
|
│ 7389 │ BMP180 │ 3735 │ 50.136 │ 11.062 │ 2019-06-01T00:00:06 │ 98905 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 12.1 │
|
|||
|
│ 13199 │ BMP180 │ 6664 │ 52.514 │ 13.44 │ 2019-06-01T00:00:07 │ 101855.54 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 19.74 │
|
|||
|
│ 12753 │ BMP180 │ 6440 │ 44.616 │ 2.032 │ 2019-06-01T00:00:07 │ 99475 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 17 │
|
|||
|
│ 16956 │ BMP180 │ 8594 │ 52.052 │ 8.354 │ 2019-06-01T00:00:08 │ 101322 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 17.2 │
|
|||
|
└───────────┴─────────────┴──────────┴────────┴────────┴─────────────────────┴───────────┴──────────┴───────────────────┴─────────────┘
|
|||
|
```
|
|||
|
|
|||
|
2. データをClickHouseに保存するために、以下の`MergeTree`テーブルを使用します:
|
|||
|
|
|||
|
```sql
|
|||
|
CREATE TABLE sensors
|
|||
|
(
|
|||
|
sensor_id UInt16,
|
|||
|
sensor_type Enum('BME280', 'BMP180', 'BMP280', 'DHT22', 'DS18B20', 'HPM', 'HTU21D', 'PMS1003', 'PMS3003', 'PMS5003', 'PMS6003', 'PMS7003', 'PPD42NS', 'SDS011'),
|
|||
|
location UInt32,
|
|||
|
lat Float32,
|
|||
|
lon Float32,
|
|||
|
timestamp DateTime,
|
|||
|
P1 Float32,
|
|||
|
P2 Float32,
|
|||
|
P0 Float32,
|
|||
|
durP1 Float32,
|
|||
|
ratioP1 Float32,
|
|||
|
durP2 Float32,
|
|||
|
ratioP2 Float32,
|
|||
|
pressure Float32,
|
|||
|
altitude Float32,
|
|||
|
pressure_sealevel Float32,
|
|||
|
temperature Float32,
|
|||
|
humidity Float32,
|
|||
|
date Date MATERIALIZED toDate(timestamp)
|
|||
|
)
|
|||
|
ENGINE = MergeTree
|
|||
|
ORDER BY (timestamp, sensor_id);
|
|||
|
```
|
|||
|
|
|||
|
3. ClickHouse Cloud サービスには `default` という名前のクラスタがあります。`s3Cluster` テーブル関数を使用して、クラスタ内のノードからS3ファイルを並行して読み込みます。(クラスタがない場合は、単に `s3` 関数を使用し、クラスタ名を削除してください。)
|
|||
|
|
|||
|
このクエリには時間がかかります - 圧縮されていないデータが約1.67Tあります:
|
|||
|
|
|||
|
```sql
|
|||
|
INSERT INTO sensors
|
|||
|
SELECT *
|
|||
|
FROM s3Cluster(
|
|||
|
'default',
|
|||
|
'https://clickhouse-public-datasets.s3.amazonaws.com/sensors/monthly/*.csv.zst',
|
|||
|
'CSVWithNames',
|
|||
|
$$ sensor_id UInt16,
|
|||
|
sensor_type String,
|
|||
|
location UInt32,
|
|||
|
lat Float32,
|
|||
|
lon Float32,
|
|||
|
timestamp DateTime,
|
|||
|
P1 Float32,
|
|||
|
P2 Float32,
|
|||
|
P0 Float32,
|
|||
|
durP1 Float32,
|
|||
|
ratioP1 Float32,
|
|||
|
durP2 Float32,
|
|||
|
ratioP2 Float32,
|
|||
|
pressure Float32,
|
|||
|
altitude Float32,
|
|||
|
pressure_sealevel Float32,
|
|||
|
temperature Float32,
|
|||
|
humidity Float32 $$
|
|||
|
)
|
|||
|
SETTINGS
|
|||
|
format_csv_delimiter = ';',
|
|||
|
input_format_allow_errors_ratio = '0.5',
|
|||
|
input_format_allow_errors_num = 10000,
|
|||
|
input_format_parallel_parsing = 0,
|
|||
|
date_time_input_format = 'best_effort',
|
|||
|
max_insert_threads = 32,
|
|||
|
parallel_distributed_insert_select = 1;
|
|||
|
```
|
|||
|
|
|||
|
以下はレスポンスです - 行数と処理速度を示しています。6M行/秒以上の速度で入力されています!
|
|||
|
|
|||
|
```response
|
|||
|
0 rows in set. Elapsed: 3419.330 sec. Processed 20.69 billion rows, 1.67 TB (6.05 million rows/s., 488.52 MB/s.)
|
|||
|
```
|
|||
|
|
|||
|
4. `sensors` テーブルのストレージディスクがどれくらい必要か見てみましょう:
|
|||
|
|
|||
|
```sql
|
|||
|
SELECT
|
|||
|
disk_name,
|
|||
|
formatReadableSize(sum(data_compressed_bytes) AS size) AS compressed,
|
|||
|
formatReadableSize(sum(data_uncompressed_bytes) AS usize) AS uncompressed,
|
|||
|
round(usize / size, 2) AS compr_rate,
|
|||
|
sum(rows) AS rows,
|
|||
|
count() AS part_count
|
|||
|
FROM system.parts
|
|||
|
WHERE (active = 1) AND (table = 'sensors')
|
|||
|
GROUP BY
|
|||
|
disk_name
|
|||
|
ORDER BY size DESC;
|
|||
|
```
|
|||
|
|
|||
|
1.67Tは310 GiBに圧縮されており、20.69億行があります:
|
|||
|
|
|||
|
```response
|
|||
|
┌─disk_name─┬─compressed─┬─uncompressed─┬─compr_rate─┬────────rows─┬─part_count─┐
|
|||
|
│ s3disk │ 310.21 GiB │ 1.30 TiB │ 4.29 │ 20693971809 │ 472 │
|
|||
|
└───────────┴────────────┴──────────────┴────────────┴─────────────┴────────────┘
|
|||
|
```
|
|||
|
|
|||
|
5. それでは、データをClickHouseにインポートしたので、分析を行いましょう。センサーが増えたことで、データの量が時間とともに増加していることに注目してください:
|
|||
|
|
|||
|
```sql
|
|||
|
SELECT
|
|||
|
date,
|
|||
|
count()
|
|||
|
FROM sensors
|
|||
|
GROUP BY date
|
|||
|
ORDER BY date ASC;
|
|||
|
```
|
|||
|
|
|||
|
SQLコンソールで結果を可視化するためにチャートを作成できます:
|
|||
|
|
|||
|
![Number of events per day](./images/sensors_01.png)
|
|||
|
|
|||
|
6. 次のクエリは、非常に暑く湿度の高い日数をカウントします:
|
|||
|
|
|||
|
```sql
|
|||
|
WITH
|
|||
|
toYYYYMMDD(timestamp) AS day
|
|||
|
SELECT day, count() FROM sensors
|
|||
|
WHERE temperature >= 40 AND temperature <= 50 AND humidity >= 90
|
|||
|
GROUP BY day
|
|||
|
ORDER BY day asc;
|
|||
|
```
|
|||
|
|
|||
|
こちらがその結果の視覚化です:
|
|||
|
|
|||
|
![Hot and humid days](./images/sensors_02.png)
|
|||
|
|
|||
|
|