比较非常大的数据帧

问题描述 投票:0回答:1

我正在尝试比较两个非常大的数据帧,每个数据帧在 Spark 中都有大约 10 PB 的数据。即使增加内存配置后,执行也会抛出内存不足的问题。谁能建议一个更好的替代方案来解决这个问题?

我正在使用的方法:

  1. 为每个数据帧生成 row_hashes
  2. diff = df.select('row_hash') - df1.select('row_hash')
  3. diff.join(df, df.columns.toSeq, "内部")
apache-spark bigdata data-comparison
1个回答
0
投票

您可以使用 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")

这个方法肯定比直接比较要好。然而,您可能会发现,对于您所讨论的规模,您肯定还需要使用配置设置。

© www.soinside.com 2019 - 2024. All rights reserved.