2017-06-02 56 views
2

我移植了一些代碼從星火1.6至2.1星火與下面的問題搏鬥行數據幀:問題,以創建包含Option [T]

這星火1.6

import org.apache.spark.sql.types.{LongType, StructField, StructType} 

val schema = StructType(Seq(StructField("i", LongType,nullable=true)))  
val rows = sparkContext.parallelize(Seq(Row(Some(1L)))) 
sqlContext.createDataFrame(rows,schema).show 

完美地工作在星火2.1.1相同的代碼:

import org.apache.spark.sql.types.{FloatType, LongType, StructField, StructType} 

val schema = StructType(Seq(StructField("i", LongType,nullable=true))) 
val rows = ss.sparkContext.parallelize(Seq(Row(Some(1L)))) 
ss.createDataFrame(rows,schema).show 

提供了以下運行時異常:

org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 8.0 failed 4 times, most recent failure: Lost task 0.3 in stage 8.0 (TID 72, i89203.sbb.ch, executor 9): java.lang.RuntimeException: Error while encoding: java.lang.RuntimeException: scala.Some is not a valid external type for schema of bigint 

那麼,如果我想要可空Long而不是使用Option[Long],我應該如何將這些代碼轉換爲Spark 2.x?

回答

1

其實是有一個JIRA SPARK-19056關於這個問題,它實際上不是一個。

所以這種行爲是故意的。

允許 Option永遠不會記錄並帶來了很多的煩惱,當我們應用編碼器的結構到所有類型的操作。自Spark 2.0以來,請使用Dataset進行類型化操作/自定義對象。例如

val ds = Seq(1 -> None, 2 -> Some("str")).toDS 
ds.toDF // schema: <_1: int, _2: string> 
+0

感謝這個信息。我知道打算輸入數據集它是最乾淨的解決方案,但也需要一些時間來重構代碼 –

+0

@RaphaelRoth唯一的問題是,周圍沒有任何詞彙。這是標準。 – eliasah

+0

我不太確定強類型數據集是否真的會成爲新標準......我有些懷疑 –

1

的錯誤消息是清楚它說,當需要

scala.Some is not a valid external type for schema of bigint 

bigintSome用於所以你需要使用OptiongetOrElse結合,使我們可以定義nullOption回報nullpointer。下面的代碼應該爲你工作

val sc = ss.sparkContext 
val sqlContext = ss.sqlContext 
val schema = StructType(Seq(StructField("i", LongType,nullable=true))) 
val rows = sc.parallelize(Seq(Row(Option(1L) getOrElse(null)))) 
sqlContext.createDataFrame(rows,schema).show 

我希望這個答案是有幫助的

+0

感謝,這確實是我的情況 –

+0

偉大最簡單的「解決辦法」聽到:) –