拼花地板行组上的地图

2024-10-03 04:29:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我们有一位大师->;细节数据集,其中主数据由API访问,细节数据位于HDFS上的Parquet文件中

主数据包含所有详细信息,以确定我们要查找的每一行数据所存储的确切文件。当用户查询索引时,他们会收到返回索引结果,通常是分布在大约500个文件中的大约20k行键指针,每个行键将返回1行或更多行;通常,这样的查询对于一个行键将返回数千行

环境:PySpark 2.3.0和Python 3.6

因为我们确切地知道每个数据点所在的文件,所以我一直在使用binaryFiles读取各个拼花文件,并将(文件名,字节)连同索引结果一起传递给映射器,这些结果将广播给所有执行器

# indexdf is the Pandas dataframe containing the index results, broadcast to all executors.
brdcst = sc.broadcast(indexdf)
sc.binaryFiles(",".join(pfileobj)).map(lambda x: self.processFile(x, brdcst)).collect()

这段代码对于小文件非常有效,但是当文件变大时,我要么超过2GB Spark shuffle限制,要么在返回结果时超过Pickling max serializable size限制

我的Parquet rowgroups在row键上有统计信息,所以如果我可以基于Parquet rowgroups进行映射,比如binaryFiles,但是使用(filename, rowgroup_stats, rowgroup_data)(大致上)这样的数据集,我想我可以克服所有这些问题,并获得更好的并行化来引导

我应该考虑的想法或新方向

早在这个项目开始时,我确实尝试过将每个文件分别加载到sparksql中并进行连接,但是速度非常慢,因为我没有实现跨文件的并行化。我还尝试将所有文件加载到一个sparksql数据帧中并加入,但这项工作花费了10倍多的时间,因为我失去了知道数据所在位置的优势,不得不扫描整个数据帧


Tags: 文件the数据细节broadcastsc大师parquet