データにnull値を持つRDD[(Seq[String], Seq[String])]
があります。私はそれがスロー示して打つようしかし、すぐに、String型のnullable scala.matcherrorの一部(null)
val rdd = sc.parallelize(Seq((Seq("111","aaa"),Seq("xx",null))))
val df = rdd.toDF("col1","col2")
val keys = Array("col1","col2")
val values = df.flatMap {
case Row(t1: Seq[String], t2: Seq[String]) => Some((t1 zip t2).toMap)
case Row(_, null) => None
}
val transposed = values.map(someFunc(keys))
val schema = StructType(keys.map(name => StructField(name, DataTypes.StringType, nullable = true)))
val transposedDf = sc.createDataFrame(transposed, schema)
transposed.show()
それは私がtransposedDFを作成する時点まで正常に動作: RDDは、データフレームに変換するには、サンプルコードは以下のこの
+----------+----------+
| col1| col2|
+----------+----------+
|[111, aaa]|[xx, null]|
+----------+----------+
のように見えます次のエラーが発生しました:
scala.MatchError: null
at org.apache.spark.sql.catalyst.CatalystTypeConverters$StringConverter$.toCatalystImpl(CatalystTypeConverters.scala:295)
at org.apache.spark.sql.catalyst.CatalystTypeConverters$StringConverter$.toCatalystImpl(CatalystTypeConverters.scala:294)
at org.apache.spark.sql.catalyst.CatalystTypeConverters$CatalystTypeConverter.toCatalyst(CatalystTypeConverters.scala:97)
at org.apache.spark.sql.catalyst.CatalystTypeConverters$StructConverter.toCatalystImpl(CatalystTypeConverters.scala:260)
at org.apache.spark.sql.catalyst.CatalystTypeConverters$StructConverter.toCatalystImpl(CatalystTypeConverters.scala:250)
at org.apache.spark.sql.catalyst.CatalystTypeConverters$CatalystTypeConverter.toCatalyst(CatalystTypeConverters.scala:102)
at org.apache.spark.sql.catalyst.CatalystTypeConverters$$anonfun$createToCatalystConverter$2.apply(CatalystTypeConverters.scala:401)
at org.apache.spark.sql.SQLContext$$anonfun$6.apply(SQLContext.scala:492)
at org.apache.spark.sql.SQLContext$$anonfun$6.apply(SQLContext.scala:492)
この場合、コードが正常に動作します。私はnull値があるときになぜ失敗するのか理解できません。なぜなら、nullableをtrueにしてStringTypeのスキーマを指定しているからです。何か間違っているのですか?
case Row(t1: Seq[String], t2: Seq[String]) => Some((t1 zip t2).toMap)
T1の値に制限はありません:私は、この行を、それがソースに表示されるように、パターンマッチが直線的に行われる2.10
IIUCでは、型パターンはnullと決して一致しません.b/c instanceofは常にfalseです。 –
@ som-snytt、あなたは正しいです。 – pedrofurla