mla*_*orp 5 time-series apache-spark parquet
我正在探索以可扩展且经济高效的方式存储来自传感器的大量数据(时间序列数据)的方法。
目前,我正在为每个传感器编写一个 CSV 文件,按日期分区,因此我的文件系统层次结构如下所示:
client_id/sensor_id/year/month/day.csv
我的目标是能够对此数据执行 SQL 查询(通常获取特定客户端/传感器的时间范围、执行聚合等)我尝试将其加载到 和Postgres,timescaledb但数据量太大并且查询速度慢得不合理。
我现在正在尝试使用Spark和Parquet文件来执行这些查询,但我有一些问题无法从我对该主题的研究中得到解答,即:
我正在将此数据转换为镶木地板文件,所以我现在有这样的内容:
client_id/sensor_id/year/month/day.parquet
但我担心的是,当Spark加载包含许多Parquet文件的顶部文件夹时,行组信息的元数据并不像我使用包含所有数据(按client/sensor/year/month/day. 这是真的?或者拥有多个 Parquet 文件或单个分区的 Parquet 文件是否相同?我知道镶木地板文件在内部存储在像我正在使用的文件夹层次结构中,但我不清楚这如何影响文件的元数据。
我无法执行此操作的原因是我不断接收新数据,并且根据我的理解,由于页脚元数据工作的性质,我无法附加到镶木地板文件。它是否正确?现在,我只需将前一天的数据转换为镶木地板,并为每个客户端的每个传感器创建一个新文件。
谢谢。
小智 0
您可以将结构化流与 kafka 结合使用(因为您已经在使用它)来实时处理数据并以 parquet 格式存储数据。而且,是的,您可以将数据附加到镶木地板文件中。使用 SaveMode.Append 例如
df.write.mode('append').parquet(path)
您甚至可以按小时对数据进行分区。客户端/传感器/年/月/日/小时这将进一步提高您查询时的性能。您可以根据系统时间创建小时分区,或根据要对数据运行的查询类型创建时间戳列。
如果您选择基于时间戳列进行分区,则可以使用watermaking来处理延迟记录。
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
5276 次 |
| 最近记录: |