为预测创建单个对象DataFrame

时间:2017-06-13 10:22:39

标签: spark-streaming

一旦我对我的分类模型进行了培训,我希望他们在我的Web应用程序中使用它来对给定会话收集的数据进行分类预测。 那是: 1)我有一些会话数据结构,我需要映射到DataFrame行 2)将DataFrame行输入我的ML模型以预测分类 3)使用带有始发会话的预测将其显示给浏览器前面的用户。

创建DataFrame作为我之前看到的Spark管道的输入的示例是从数据源(如文件)创建的。现在,首先创建单个POJO或JsonNode似乎有点笨拙,将其序列化为仅包含记录的文件,然后使用该文件创建DataFrame以提供模型。 写这篇文章我也觉得为每个请求创建和拆除ML管道可能不是一个好主意,这似乎是从这种方法开始的。

所以也许我应该更好地思考“Spark Streaming”?

将映射的会话数据提供给某种消息队列并将其提供给我的Spark管道?什么样的“流”适合这里?

我在某地读过Spark流以小批量消耗流而不是按记录记录 - 这意味着有一些延迟,直到收集到足够的记录来填充微批(或者一些预先配置的延迟等待直到考虑微批次要“足够”)。这对Web应用程序的响应性意味着什么?我可以像每100毫秒一样触发微批次吗?

如果有人能指出我正确的方向,我将不胜感激。 也许Spark不适合这里,我应该切换到Apache Flink?

提前致谢,Bernd

1 个答案:

答案 0 :(得分:0)

  

好的,到现在为止,我找到了一些方法来解决我的问题   帮助别人:

     

使用包含一个元组的序列并单独命名列

CustomerName                                       UserName
-------------------------------------------------- --------------------------------------------------
Joe                                                Ned
Jane                                               Fred
Jon                                                Ted
Jake                                               Ned
Jerry                                              Fred
Jesus                                              Ted

(6 row(s) affected)
     

使用JSON-String

val df= spark.createDataFrame(
  Seq("val1", "val2")
).toDF("label1", "label2")    
     

不工作:从序列案例类对象创建:

val sqlContext = spark.sqlContext 
val jsonData= """{ "label1": "val1", "label2": "val2" }"""    
val rdd= sparkSession.sparkContext.parallelize(Seq(jsonData))
val df= sqlContext.read.json(rdd)
     

这编译好,但在运行时产生异常:

 [error] a.a.OneForOneStrategy - java.lang.RuntimeException:
Error while encoding:  java.lang.ClassCastException:
es.core.recommender.Feat cannot be cast to es.core.recommender.Feat
     

我希望能够包含更多的堆栈跟踪,但这位光荣的编辑器   不会让我......

     

很高兴知道为什么这个替代方案不起作用......