如何在实际数据(文本文件或sql)上使用Spark的PrefixSpan?

时间:2019-01-11 17:09:48

标签: scala apache-spark

我正在尝试使用Spark的PrefixSpan算法,但是很难获得正确形状的数据以馈入算法。感觉就像是Monty Python的小品,API一直在努力使程序员感到困惑。

我的数据是一个行列表,每个行包含一个文本项列表。

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

我已经通过两种方式提供了此数据:Hive中的sql表(其中每行包含一个项目数组)和文本文件,其中每行包含上述项目。

官方示例创建了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定义)。这样可以更轻松地处理类型错误。

0 个答案:

没有答案