Я пытаюсь использовать алгоритм 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). Это намного облегчило работу с ошибкой типа.