Spark流 - 自定义接收器和数据帧推断模式

时间:2016-09-29 15:55:54

标签: scala apache-spark dataframe

考虑接收器

下面的代码片段
val incomingMessage = subscriberSocket.recv(0)
val stringMessages = new String(incomingMessage).stripLineEnd.split(',')
store(Row.fromSeq(Array(stringMessages(0)) ++ stringMessages.drop(2)))

在接收方,我不希望将每个列类型的表(由stringMessages(0)表示)转换为实际的表类型。

在代码的主要部分,当我做

val df = sqlContext.createDataFrame(eachGDNRdd,getSchemaAsStructField)
println(df.collect().length)

我收到以下错误

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double
        at scala.runtime.BoxesRunTime.unboxToDouble(BoxesRunTime.java:119)
        at org.apache.spark.sql.catalyst.expressions.BaseGenericInternalRow$class.getDouble(rows.scala:44)

现在,模式由String和Int字段组成。我已经交叉验证,该字段匹配类型。但是,看起来像火花数据帧并不是在推断出类型。

问题
1.在运行时间(除非存在矛盾),不应该激发模式的类型吗? 2.由于表是动态的,因此架构根据每行的第一个元素(包含表名)而变化。是否有任何简单的建议方法来即时修改架构?

或者我错过了一些明显的东西?

1 个答案:

答案 0 :(得分:0)

我是Spark的新手并且您没有说明您正在运行的版本,但是在v2.1.0中,由于您提到的具体原因,默认情况下会禁用架构推断;如果记录结构不一致,Spark无法可靠地推断出架构。您可以通过将<%= %>设置为true来启用架构推断,但我认为您最好自己指定架构。