【问题标题】:Is it possible to store custom class object in Spark Data Frame as a column value?是否可以将自定义类对象作为列值存储在 Spark Data Frame 中?
【发布时间】:2019-06-06 21:30:47
【问题描述】:

我正在使用 LSH 算法解决重复文档检测问题。为了处理大规模数据,我们使用了 spark。

我有大约 300,000 个文档,每个文档至少 100-200 个单词。在 Spark 集群上,这些是我们在数据帧上执行的步骤。

  1. 运行 Spark ML 管道以将文本转换为标记。

pipeline = Pipeline().setStages([
        docAssembler,
        tokenizer,
        normalizer,
        stemmer,
        finisher,
        stopwordsRemover,
       # emptyRowsRemover
    ])
model = pipeline.fit(spark_df)
final_df = model.transform(spark_df)

  1. 对于每个文档,使用 datasketch(https://github.com/ekzhu/datasketch/) 库获取 MinHash 值并将其存储为新列。
final_df_limit.rdd.map(lambda x: (CalculateMinHash(x),)).toDF()

第二步失败,因为 spark 不允许我们将自定义类型值存储为列。 Value 是 MinHash 类的对象。

有谁知道如何将 Minhash 对象存储在数据框中?

【问题讨论】:

    标签: dataframe pyspark lsh


    【解决方案1】:

    我认为在 DataFrames 中保存 python 对象是不可能的,但您可以通过以下几种方式来规避它:

    • 存储结果而不是对象(不确定MinHash是如何工作的,但是如果值是数字/字符串,应该很容易从类对象中提取出来)。
    • 如果这不可行,因为您仍然需要对象的某些属性,您可能希望使用Pickle 对其进行序列化,将序列化结果保存为编码字符串。这会强制您在每次要使用该对象时进行反序列化。

      final_df_limit.rdd.map(lambda x: base64.encodestring(pickle.dumps(CalculateMinHash(x),))).toDF()

    • 替代方法可能是使用Spark MinHash implementation,但这可能无法满足您的所有要求。

    【讨论】:

    • 谢谢@martinarroyo。我使用第一个选项解决了这个问题。我从 minhash 对象中获取长值数组并将其转换为字符串。
    • 很高兴听到这个消息!如果您可以使用最终解决方案更新您的问题以确保完整性,那可能会很好。
    猜你喜欢
    • 2017-10-17
    • 2017-08-26
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    相关资源
    最近更新 更多