2017-02-03 28 views
0

我有一個模式類似 -如何允許在Spark 2的數據框中接受None值?

val schema = StructType(Seq (
StructField("a", StringType, true), 
StructField("b", StringType, true), 
StructField("c", StringType, true) 
)) 

and making a dataframe like - 

import scala.collection.JavaConverters._ 

val listrow: List[Row] = List(Row("E-001", "P-001", None), Row("E-001", "P-001", "Attending")) 
val rdd = sqlContext.sparkContext.parallelize(listrow) 
val df = sqlContext.createDataFrame(rdd, scm) 

現在,當我做了df.first(),我得到一個錯誤,其實質是 - 了java.lang.RuntimeException:錯誤而編碼: java.lang.RuntimeException:scala.None $不是字符串模式的有效外部類型

請注意,我需要僅以此方式創建df。以上只是一個例子,但生產中的代碼有點複雜。我認爲它曾經在Spark 1.6中工作,但在Spark 2.0.1中開始失敗。這與編碼器有關嗎?請注意,一些數據將始終爲None,並且df需要處理它。有沒有辦法處理這個或數據不能有沒有?

其他人在這裏也看到了這個,可能知道解決方案是什麼?

感謝預期!

+1

您的列需要字符串,但「None」不是字符串。將None轉換爲字符串或將列更改爲接受'Option [String]'而不是'String'並將字符串轉換爲'Option [String]'s。真的,我想要修正產生這些「無」的代碼,這似乎是一個主要的設計缺陷。 – puhlen

+0

我同意。但是有什麼可以通過架構來完成的呢? –

+0

你想讓數據在數據框中看起來像什麼?你真的想要不同的類型(選項和字符串)坐在同一列嗎?或者你希望能夠插入這兩種類型並讓它們自動均化爲單一類型? – puhlen

回答

4

您可以替換null.asInstanceOf [字符串]的無:

val listrow: List[Row] = List(Row("E-001", "P-001", null.asInstanceOf[String]), Row("E-001", "P-001", "Attending")) 

scala> df.show 
+-----+-----+---------+ 
| a| b|  c| 
+-----+-----+---------+ 
|E-001|P-001|  null| 
|E-001|P-001|Attending| 
+-----+-----+---------+ 

或者去什麼是前面提到的,並使用了一個選項的情況下,類[字符串]爲3個值:

case class Foo(a: String, b:String, c:Option[String]) 

val listFoo: List[Foo] = List(Foo("E-001", "P-001", None), Foo("E-001", "P-001", Some("Attending"))) 
listFoo.toDF.show 
+-----+-----+---------+ 
| a| b|  c| 
+-----+-----+---------+ 
|E-001|P-001|  null| 
|E-001|P-001|Attending| 
+-----+-----+---------+ 
+0

感謝您的回覆,但正如我所提到的,如果我所問的是可能的,我正在尋找模式來適應這些數據更改。 –

+1

在將數據輸入數據框之前修改數據是更可取的。如果你真的想在同一列中有選項和字符串,你可以使用Any類型而不是StringType。 – puhlen

+0

是否有DataType類型稱爲Any? –

相關問題