我正在尝试比较两个非常大的数据帧,每个数据帧在 Spark 中都有大约 10 PB 的数据。即使增加内存配置后,执行也会抛出内存不足的问题。谁能建议一个更好的替代方案来解决这个问题?
我正在使用的方法:
您可以使用 Spark 的 LSH 实现 通过非常严格的相似性度量将两个数据帧散列到较低的维度。哈希后,您可以执行 approxSimilarityJoin
有关如何执行此操作的一些基本代码:
from pyspark.ml.feature import MinHashLSH
from pyspark.ml.linalg import Vectors
from pyspark.sql.functions import col
# Create feature vectors
df = df.withColumn("features", Vectors.dense(col("feature_col1"), col("feature_col2")))
df1 = df1.withColumn("features", Vectors.dense(col("feature_col1"), col("feature_col2")))
# Initialize LSH model
mh = MinHashLSH(inputCol="features", outputCol="hashes", numHashTables=5)
# Fit the model and transform data
model = mh.fit(df)
df_hashed = model.transform(df)
df1_hashed = model.transform(df1)
# Approximate join to find potential matches
approx_joined_df = model.approxSimilarityJoin(df_hashed, df1_hashed, 0.1, distCol="JaccardDistance")
# Filter based on a distance threshold for very very similar items
filtered_df = approx_joined_df.filter("JaccardDistance < 0.05")
这个方法肯定比直接比较要好。然而,您可能会发现,对于您所讨论的规模,您肯定还需要使用配置设置。