Do数据集投影受益于数据集分区



我们希望使用Projections来加快对具有数千个小(kb大小(文件的大型增量数据集的过滤和连接。

是否建议对主数据集进行分区(transforms.api.IncrementalTransformOutput.write_dataframe()partitionBy=[col1, col2,...](,以减少文件数量,或者这是多余的工作,因为这是由Projections完成的?

如果建议优化主要数据集,是否有关于何时进行优化的指导方针?

好问题!由于Spark使用分布式文件存储,因此可以使用许多技术来提高性能。答案在于你想在重新分区后对数据做什么。性能需要进行经验测试(尝试一个设置,看看它是否有所改进(,并查看构建报告以查看火花细节。你可以使用以下几种技术:

  1. 基本技术:使用单个分区并在内存中为小数据集做一些事情:如果数据很小,可以使用广播连接等技术来保持内存。您还应该将数据重新划分为合理的大小,以便在开销和并行化之间进行权衡。我使用的经验法则是将分区保持在100-500 MB之间。您还应该过滤掉任何不需要的数据,或者删除整列。Spark不是很聪明,所以保持过滤器简单明了以获得最佳性能。最后,确保您的数据是干净和一致的。例如,修改"Spark"one_answers"Spark"以使用一致的大小写和间距。否则,它们将有两个不同的代码,Spark会将其读取为两个不同值。

  2. 哈希分区:用于下游计算何时需要匹配行键(聚合、联接等(,和/或预排序何时也有助于加快不同的用例。如果要进行多次联接,则应该使用哈希分区,并且在保存数据之前不要忘记重新分区。

    df=df.重新分区(200(output.write_dataframe(df,bucket_cols=["patient_id"],bucket_count=200,sort_by=["patient_id"](

  3. 单元分区:大型数据集,您希望在筛选过程中进行大量修剪,并且具有低基数列。只有在对基数较低的数据集进行大量筛选时,才能执行此操作。如果在基数很高的数据集上进行Hive分区,那么最终会产生太多的小文件。

    output.write_dataframe(df,partition_cols=["日期"](

我建议您写一个带有最小可验证示例的特定问题,我可以为您的用例提供更深入、更具体的答案。

最新更新