将数据添加到 Spark/Parquet 存储在磁盘上的数据
Add data to Spark/Parquet Data stored on Disk
我的处境类似于the one mentioned here。问题没有得到令人满意的回答。此外,我要处理的数据较少(每天大约 1G)。
我的情况:我有一定数量的数据 (~500G) 可以作为镶木地板使用(即商定的 "storage format")并且我得到定期的增量更新。我希望能够处理 ETL 部分以及之后的分析部分。
为了能够在某些 "intermediate data products" 上高效地生成更新,我看到了三个选项:
- 使用追加模式保存,保留差异数据集直到创建所有数据产品
- 使用 附加模式 保存,添加一个额外的列
upload_timestamp
将每个更新保存到单独的文件夹,例如:
data
+- part_001
| +- various_files.parquet
+- part_002
| +- various_files.parquet
+- ...
这样可以使用 data/*
作为 read.parquet()
的路径读取整个数据集。
我倾向于最后一种方法,也是因为有评论(证据?)当分区数量增加时附加模式会导致问题(参见示例 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
。
我的处境类似于the one mentioned here。问题没有得到令人满意的回答。此外,我要处理的数据较少(每天大约 1G)。
我的情况:我有一定数量的数据 (~500G) 可以作为镶木地板使用(即商定的 "storage format")并且我得到定期的增量更新。我希望能够处理 ETL 部分以及之后的分析部分。
为了能够在某些 "intermediate data products" 上高效地生成更新,我看到了三个选项:
- 使用追加模式保存,保留差异数据集直到创建所有数据产品
- 使用 附加模式 保存,添加一个额外的列
upload_timestamp
将每个更新保存到单独的文件夹,例如:
data +- part_001 | +- various_files.parquet +- part_002 | +- various_files.parquet +- ...
这样可以使用
data/*
作为read.parquet()
的路径读取整个数据集。
我倾向于最后一种方法,也是因为有评论(证据?)当分区数量增加时附加模式会导致问题(参见示例 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
。