考虑接收器
下面的代码片段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.由于表是动态的,因此架构根据每行的第一个元素(包含表名)而变化。是否有任何简单的建议方法来即时修改架构?
或者我错过了一些明显的东西?
答案 0 :(得分:0)
我是Spark的新手并且您没有说明您正在运行的版本,但是在v2.1.0中,由于您提到的具体原因,默认情况下会禁用架构推断;如果记录结构不一致,Spark无法可靠地推断出架构。您可以通过将<%= %>
设置为true来启用架构推断,但我认为您最好自己指定架构。