2016-09-29 41 views
0

在接收机考虑下面的代码片断火花流 - 定制接收器和数据帧推断模式

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) 

现在,该架构包含两个字符串和Int场。我已经交叉验证,按字段匹配字段。但是,看起来像spark数据框不是推断类型。


问题
1.不宜火花推断架构的类型,在运行时(除非有矛盾)?
2.由于表是动态的,因此架构会根据每行的第一个元素(包含表名称)而变化。有没有简单的建议方式来即时修改模式?

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

回答

0

我是Spark的新手,并且没有提供您正在运行的版本,但是在v2.1.0中,由于您提到的具体原因,默认情况下禁用了模式推理;如果记录结构不一致,则Spark无法可靠地推断该架构。您可以通过将spark.sql.streaming.schemaInference设置为true来启用模式推断,但我认为您最好自己指定模式。