Как использовать Spark PrefixSpan для реальных данных (текстовый файл или sql)? - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь использовать алгоритм Spark PrefixSpan , но сложно получить данные в правильной форме для подачи в алгоритм. Это похоже на пародию Monty Python, где API активно работает, чтобы запутать программиста.

Мои данные - это список строк, каждая из которых содержит список текстовых элементов.

a b c c c d 
b c d e
a b
...

Я сделал эти данные доступными двумя способами: таблицей sql в Hive (где каждая строка содержит массив элементов) и текстовыми файлами, где каждая строка содержит элементы выше.

Официальный пример создает Seq из Array(Array).

Если я использую sql, я получаю следующий тип:

org.apache.spark.sql.DataFrame = [seq: array<string>]

Если я читаю в тексте, я получаю этот тип:

org.apache.spark.sql.Dataset[Array[String]] = [value: array<string>]

Вот пример ошибки, которую я получаю (если я передаю данные из sql):

error: overloaded method value run with alternatives:
  [Item, Itemset <: Iterable[Item], Sequence <: Iterable[Itemset]](data: org.apache.spark.api.java.JavaRDD[Sequence])org.apache.spark.mllib.fpm.PrefixSpanModel[Item] <and>
  [Item](data: org.apache.spark.rdd.RDD[Array[Array[Item]]])(implicit evidence$1: scala.reflect.ClassTag[Item])org.apache.spark.mllib.fpm.PrefixSpanModel[Item]
 cannot be applied to (org.apache.spark.sql.DataFrame)
       new PrefixSpan().setMinSupport(0.5).setMaxPatternLength(5).run( sql("select seq from sequences limit 1000") )
                                                                  ^

Вот пример, если я передаю текстовые файлы:

error: overloaded method value run with alternatives:
  [Item, Itemset <: Iterable[Item], Sequence <: Iterable[Itemset]](data: org.apache.spark.api.java.JavaRDD[Sequence])org.apache.spark.mllib.fpm.PrefixSpanModel[Item] <and>
  [Item](data: org.apache.spark.rdd.RDD[Array[Array[Item]]])(implicit evidence$1: scala.reflect.ClassTag[Item])org.apache.spark.mllib.fpm.PrefixSpanModel[Item]
 cannot be applied to (org.apache.spark.sql.Dataset[Array[String]])
       new PrefixSpan().setMinSupport(0.5).setMaxPatternLength(5).run(textfiles.map( x => x.split("\u0002")).limit(3))
                                                                  ^

Я пытался сформировать данные, используя приведение и другую неоправданно сложную логику.

Это не может быть так сложно. Учитывая список предметов (в очень разумном формате, описанном выше), как, черт возьми, мне его подать PrefixSpan?

редактирование: Я на спарке 2.2.1

Решено: Столбец в таблице, к которой я обращался, содержал коллекции в каждой ячейке. Это приводило к тому, что возвращаемый результат находился внутри WrappedArray. Я изменил свой запрос, чтобы столбец результата содержал только строку (от concat_ws). Это намного облегчило работу с ошибкой типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...