Можно ли сохранить объект пользовательского класса в Spark Data Frame как значение столбца? - PullRequest
0 голосов
/ 12 января 2019

Я работаю над проблемой обнаружения дубликатов документов с использованием алгоритма LSH. Для обработки крупномасштабных данных мы используем spark.

У меня около 300 тыс. Документов, по крайней мере, 100-200 слов на документ. На искровом кластере это шаги, которые мы выполняем для фрейма данных.

  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. Для каждого документа получите значение MinHash, используя datasketch (https://github.com/ekzhu/datasketch/) библиотека и сохраните его как новый столбец.
final_df_limit.rdd.map(lambda x: (CalculateMinHash(x),)).toDF()

2-й шаг не выполняется, поскольку искра не позволяет нам сохранять значение пользовательского типа в виде столбца. Значение является объектом класса MinHash.

Кто-нибудь знает, как я могу хранить объекты Minhash в данных?

1 Ответ

0 голосов
/ 16 января 2019

Я не думаю, что возможно сохранить объекты Python в DataFrames, но вы можете обойти это несколькими способами:

  • Сохраните результат вместо объекта (не уверен, как работает MinHash, но если значение является числовым / строковым, его будет легко извлечь из объекта класса).
  • Если это невозможно, поскольку вам все еще нужны некоторые свойства объекта, вы можете сериализовать его, используя Pickle , сохранив сериализованный результат в виде закодированной строки. Это заставляет вас десериализовать каждый раз, когда вы хотите использовать объект.

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

  • Альтернативой может быть использование реализации Spark MinHash , но это может не соответствовать всем вашим требованиям.

...