2016-09-29 40 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來啓用模式推斷,但我認爲您最好自己指定模式。