Python PySpark-在重新分区的批上应用函数

Python PySpark-在重新分区的批上应用函数,python,apache-spark,pyspark,partitioning,Python,Apache Spark,Pyspark,Partitioning,我在5000亿对上使用MinHashLSH和approxSimilarityJoin。它对于我当前的集群设置来说太大了,因此,我想批量运行它 我希望对数据进行分区,并在每个分区上迭代运行approxSimilarityJoin,以便集群能够处理它 我目前的职能是: matched_df = model.stages[-1].approxSimilarityJoin(df1, df2, 1.0, "confidence") 但是我被困在如何组合重新分区,foreachPartition和近似相似

我在5000亿对上使用
MinHashLSH
approxSimilarityJoin
。它对于我当前的集群设置来说太大了,因此,我想批量运行它

我希望对数据进行分区,并在每个分区上迭代运行
approxSimilarityJoin
,以便集群能够处理它

我目前的职能是:

matched_df = model.stages[-1].approxSimilarityJoin(df1, df2, 1.0, "confidence")
但是我被困在如何组合
重新分区
foreachPartition
近似相似性连接

我认为应该是这样的:

df1.repartition(100).foreachPartition(batch : model.stages[-1].approxSimilarityJoin(batch, df2, 1.0, "confidence"))

但是我有错误的语法。
foreachPartition
的正确语法是什么?

我认为使用
foreachPartition
无法实现这一点。
foreachparion
接受一个将在执行器上运行的函数,并将实际数据传递给它,而不是数据帧(这是一个将触发处理的操作,如.collect或.write,而不仅仅是转换定义)。如果您想从这个传入集重新创建一个数据帧,这也不会起作用,因为工作进程本身没有可用的spark上下文。从概念上讲,dataframe不是一个表,而是一个转换的延迟计算定义

但是,您可以做的只是使用Spark拆分
df1
。如果没有可用于筛选数据帧的键,则可以使用
randomspilt
进行筛选,例如:

df.randomSplit((0.1, 0.1, 0.1, 0.1, 0.1), seed=42)
此操作的结果是数据帧列表

[DataFrame[date: string, text: string],
 DataFrame[date: string, text: string],
 DataFrame[date: string, text: string],
 DataFrame[date: string, text: string],
 DataFrame[date: string, text: string]]

您可以使用常规Python进行迭代

dfs = df.randomSplit((0.1, 0.1, 0.1, 0.1, 0.1), seed=42)
for df in dfs:
    matched_df = model.stages[-1].approxSimilarityJoin(df, df2, 1.0, "confidence")
    do_something_with(matched_df)
要以这种方式将数据集拆分为100个部分,可以生成权重元组:

df.randomSplit(tuple([0.01 for x in range (100)]), seed=42)

你说这个集合对你来说太大是什么意思?您是否遇到内存不足的异常?以迭代方式运行此操作不会对性能产生影响。是的,由于approxSimilarityJoin()的工作方式,我的内存正在耗尽。给定两个列表,它将创建两个列表中每个元素的所有对,并计算对中两个元素之间的距离。我不需要一次计算所有对,我可以成批迭代计算。这正是我想要做的。非常感谢。