【发布时间】:2017-03-04 15:56:32
【问题描述】:
在接收器处考虑下面的代码 sn-p
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 字段组成。我已经交叉验证,该字段按类型匹配。但是,看起来 spark 数据框并没有推断出类型。
问题
1. spark不应该在运行时推断模式的类型(除非有矛盾)?
2. 由于表是动态的,架构会根据每行的第一个元素(包含表名)而有所不同。是否有任何简单的建议方法可以即时修改架构?
或者我错过了什么明显的东西?
【问题讨论】:
标签: scala apache-spark dataframe