将数据添加到 Spark/Parquet 存储在磁盘上的数据

Add data to Spark/Parquet Data stored on Disk

我的处境类似于the one mentioned here。问题没有得到令人满意的回答。此外,我要处理的数据较少(每天大约 1G)。

我的情况:我有一定数量的数据 (~500G) 可以作为镶木地板使用(即商定的 "storage format")并且我得到定期的增量更新。我希望能够处理 ETL 部分以及之后的分析部分。

为了能够在某些 "intermediate data products" 上高效地生成更新,我看到了三个选项:

我倾向于最后一种方法,也是因为有评论(证据?)当分区数量增加时附加模式会导致问题(参见示例 this SO question)。

所以我的问题是:创建这样的数据集结构是否存在严重缺陷?显然,Spark 在读取多个文件夹时需要做 "some" merging/sorting,但除此之外?

我正在使用 Spark 2.1.0。

Nathan Marz,前 Twitter 和 Lambda Architecture 的作者,描述了 垂直分区 用于在批处理层中存储数据的过程,这是真相并包含架构所见过的所有数据。这个主数据集是不可变的并且只能追加。垂直分区只是将数据分类到单独文件夹中的一个奇特名称。

这正是您在第三个选项中所描述的。

这样做可以显着提高性能,因为在主数据集上执行的函数只会访问那些与计算相关的数据。这使得批量查询和在服务层中创建索引的速度更快。文件夹的名称由您决定,但通常涉及时间戳组件。

无论您是否构建 Lambda 架构,垂直分区都会使您的分析更加高效。

我注意到目录中的文件夹数量越多,执行 spark.read 所需的时间就越长,因为 spark 对 data/metadata 进行采样以找出架构。但这可能是您必须应对的必然性。

如果您添加一个 upload-timestamp 甚至更好的 upload-date-hour 并按它分区,它自然会写入该文件夹。如果在给定的时间内有可能出现多组文件,请确保通过 api 访问写入,确保在写入现有数据之前对现有数据执行 union