是否可以将自定义 class 对象作为列值存储在 Spark 数据框中?
Is it possible to store custom class object in Spark Data Frame as a column value?
我正在使用 LSH 算法处理重复文档检测问题。为了处理大规模数据,我们正在使用 spark。
我有大约 300K 个文档,每个文档至少有 100-200 个单词。在 spark 集群上,这些是我们在数据帧上执行的步骤。
- 运行 用于将文本转换为标记的 Spark ML 管道。
pipeline = Pipeline().setStages([
docAssembler,
tokenizer,
normalizer,
stemmer,
finisher,
stopwordsRemover,
# emptyRowsRemover
])
model = pipeline.fit(spark_df)
final_df = model.transform(spark_df)
- 对于每个文档,使用 datasketch(https://github.com/ekzhu/datasketch/) 库获取 MinHash 值并将其存储为新列。
final_df_limit.rdd.map(lambda x: (CalculateMinHash(x),)).toDF()
第二步失败,因为 spark 不允许我们将自定义类型值存储为列。值是 class MinHash 的一个对象。
有谁知道如何在数据帧中存储 Minhash 对象?
我认为可能无法在 DataFrames 中保存 python 个对象,但您可以通过多种方式规避此问题:
- 存储结果而不是对象(不确定 MinHash 是如何工作的,但如果值为 numerical/string,应该很容易从 class 对象中提取它)。
如果这不可行,因为您仍然需要对象的某些属性,您可能希望使用 Pickle 对其进行序列化,将序列化结果保存为编码字符串。这会强制您在每次要使用该对象时都进行反序列化。
final_df_limit.rdd.map(lambda x: base64.encodestring(pickle.dumps(CalculateMinHash(x),))).toDF()
替代方法可能是使用 Spark MinHash implementation,但这可能不适合您的所有要求。
我正在使用 LSH 算法处理重复文档检测问题。为了处理大规模数据,我们正在使用 spark。
我有大约 300K 个文档,每个文档至少有 100-200 个单词。在 spark 集群上,这些是我们在数据帧上执行的步骤。
- 运行 用于将文本转换为标记的 Spark ML 管道。
pipeline = Pipeline().setStages([
docAssembler,
tokenizer,
normalizer,
stemmer,
finisher,
stopwordsRemover,
# emptyRowsRemover
])
model = pipeline.fit(spark_df)
final_df = model.transform(spark_df)
- 对于每个文档,使用 datasketch(https://github.com/ekzhu/datasketch/) 库获取 MinHash 值并将其存储为新列。
final_df_limit.rdd.map(lambda x: (CalculateMinHash(x),)).toDF()
第二步失败,因为 spark 不允许我们将自定义类型值存储为列。值是 class MinHash 的一个对象。
有谁知道如何在数据帧中存储 Minhash 对象?
我认为可能无法在 DataFrames 中保存 python 个对象,但您可以通过多种方式规避此问题:
- 存储结果而不是对象(不确定 MinHash 是如何工作的,但如果值为 numerical/string,应该很容易从 class 对象中提取它)。
如果这不可行,因为您仍然需要对象的某些属性,您可能希望使用 Pickle 对其进行序列化,将序列化结果保存为编码字符串。这会强制您在每次要使用该对象时都进行反序列化。
final_df_limit.rdd.map(lambda x: base64.encodestring(pickle.dumps(CalculateMinHash(x),))).toDF()
替代方法可能是使用 Spark MinHash implementation,但这可能不适合您的所有要求。