来自 The OpenSky Network 2020 的众包空中交通数据
该数据集中的数据是从完整的 OpenSky 数据集中派生和清理的,以说明 COVID-19 大流行期间空中交通的发展。它涵盖了自 2019 年 1 月 1 日以来该网络中 2500 多名成员观测到的所有航班。直到 COVID-19 大流行结束,更多数据将定期的更新到数据集中。
来源:https://zenodo.org/record/5092942#.YRBCyTpRXYd
Martin Strohmeier、Xavier Olive、Jannis Lübbe、Matthias Schäfer 和 Vincent Lenders “来自 OpenSky 网络 2019-2020 的众包空中交通数据”地球系统科学数据 13(2),2021 https://doi.org/10.5194/essd- 13-357-2021
下载数据集
运行命令:
wget -O- https://zenodo.org/record/5092942 | grep -oP 'https://zenodo.org/record/5092942/files/flightlist_\d+_\d+\.csv\.gz' | xargs wget
Download will take about 2 minutes with good internet connection. There are 30 files with total size of 4.3 GB.
创建表
CREATE TABLE opensky
(
callsign String,
number String,
icao24 String,
registration String,
typecode String,
origin String,
destination String,
firstseen DateTime,
lastseen DateTime,
day DateTime,
latitude_1 Float64,
longitude_1 Float64,
altitude_1 Float64,
latitude_2 Float64,
longitude_2 Float64,
altitude_2 Float64
) ENGINE = MergeTree ORDER BY (origin, destination, callsign);
导入数据
将数据并行导入到 ClickHouse:
ls -1 flightlist_*.csv.gz | xargs -P100 -I{} bash -c 'gzip -c -d "{}" | clickhouse-client --date_time_input_format best_effort --query "INSERT INTO opensky FORMAT CSVWithNames"'
- 这里我们将文件列表(
ls -1 flightlist_*.csv.gz
)传递给xargs
以进行并行处理。xargs -P100
指定最多使用 100 个并行工作程序,但由于我们只有 30 个文件,工作程序的数量将只有 30 个。 - 对于每个文件,
xargs
将通过bash -c
为每个文件运行一个脚本文件。该脚本通过使用{}
表示文件名占位符,然后xargs
由命令进行填充(使用-I{}
)。 - 该脚本会将文件 (
gzip -c -d "{}"
) 解压缩到标准输出(-c
参数),并将输出重定向到clickhouse-client
。 - 我们还要求使用扩展解析器解析 DateTime 字段 (--date_time_input_format best_effort) 以识别具有时区偏移的 ISO-8601 格式。
最后,clickhouse-client
会以 CSVWithNames 格式读取输入数据然后执行插入。
并行导入需要 24 秒。
如果您不想使用并行导入,以下是顺序导入的方式:
for file in flightlist_*.csv.gz; do gzip -c -d "$file" | clickhouse-client --date_time_input_format best_effort --query "INSERT INTO opensky FORMAT CSVWithNames"; done
验证数据
请求:
SELECT count() FROM opensky;
结果:
┌──count()─┐
│ 66010819 │
└──────────┘
ClickHouse 中的数据集大小只有 2.66 GiB,检查一下。
请求:
SELECT formatReadableSize(total_bytes) FROM system.tables WHERE name = 'opensky';
结果:
┌─formatReadableSize(total_bytes)─┐
│ 2.66 GiB │
└─────────────────────────────────┘
运行一些查询
总行驶距离为 680 亿公里。
请求:
SELECT formatReadableQuantity(sum(geoDistance(longitude_1, latitude_1, longitude_2, latitude_2)) / 1000) FROM opensky;
结果:
┌─formatReadableQuantity(divide(sum(geoDistance(longitude_1, latitude_1, longitude_2, latitude_2)), 1000))─┐
│ 68.72 billion │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────┘
平均飞行距离约为 1000 公里。
请求:
SELECT avg(geoDistance(longitude_1, latitude_1, longitude_2, latitude_2)) FROM opensky;
结果:
┌─avg(geoDistance(longitude_1, latitude_1, longitude_2, latitude_2))─┐
│ 1041090.6465708319 │
└────────────────────────────────────────────────────────────────────┘