一旦我对我的分类模型进行了培训,我希望他们在我的Web应用程序中使用它来对给定会话收集的数据进行分类预测。 那是: 1)我有一些会话数据结构,我需要映射到DataFrame行 2)将DataFrame行输入我的ML模型以预测分类 3)使用带有始发会话的预测将其显示给浏览器前面的用户。
创建DataFrame作为我之前看到的Spark管道的输入的示例是从数据源(如文件)创建的。现在,首先创建单个POJO或JsonNode似乎有点笨拙,将其序列化为仅包含记录的文件,然后使用该文件创建DataFrame以提供模型。 写这篇文章我也觉得为每个请求创建和拆除ML管道可能不是一个好主意,这似乎是从这种方法开始的。
所以也许我应该更好地思考“Spark Streaming”?
将映射的会话数据提供给某种消息队列并将其提供给我的Spark管道?什么样的“流”适合这里?
我在某地读过Spark流以小批量消耗流而不是按记录记录 - 这意味着有一些延迟,直到收集到足够的记录来填充微批(或者一些预先配置的延迟等待直到考虑微批次要“足够”)。这对Web应用程序的响应性意味着什么?我可以像每100毫秒一样触发微批次吗?
如果有人能指出我正确的方向,我将不胜感激。 也许Spark不适合这里,我应该切换到Apache Flink?
提前致谢,Bernd
答案 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我希望能够包含更多的堆栈跟踪,但这位光荣的编辑器 不会让我......
很高兴知道为什么这个替代方案不起作用......