我们有这样一个场景:从多个源表中读取数据,根据业务规则进行连接并应用Map。在某些情况下,从几个表中读取的数据可以用于多个目标加载。因此,为了避免在运行不同的模块时多次读取相同的数据,有没有选择如何在不同的pyspark模块中使用相同的Dataframe输出。
df1 = spark.sql(select * from table1)
df2 = spark.sql(select * from table2)
df_out = df1.join(df2, ['customer_id'], inner)
我想在pyspark\u module1.py和pyspark\u module2.py中使用df\u out,有没有办法不多次读取相同的数据,因为我们是通过调度工具并行运行程序。
2条答案
按热度按时间rqqzpn5f1#
您可以加入和预处理到一定程度,并通过
bucketBy
然后在这个预连接和预处理的数据上并行运行下游。这个https://luminousmen.com/post/the-5-minute-guide-to-using-bucketing-in-pyspark 像spark文档一样提供指导。
ubof19bj2#
这就是
cache()
以及persist()
出现在画面中cache()
将数据保存到内存中(这是默认值),直到saprk应用程序执行并persist()
允许您将您的选择扩展到磁盘/内存等。完全读取这里和这里现在,来回答您的问题—您可能需要根据实现的方式重新审视您的应用程序逻辑
catch
或者persist
如果,你写在main function
还有你的module-1
以及module-2
函数调用主函数,即使在缓存到内存中之后,也可能没有什么好处,因为每次发生函数调用时,它都会调用特定函数调用的底层逻辑,因此请尝试是否可以使用相同的代码并利用caching.