Description
When we create a Dataset from an RDD of rows with a specific schema, if the nullability of a value does not match the nullability defined in the schema, we will throw an exception that is not easy to understand.
It will be good to verify the nullability in a more explicit way.
import org.apache.spark.sql.types._ import org.apache.spark.sql.Row val schema = new StructType().add("a", StringType, false).add("b", StringType, false) val rdd = sc.parallelize(Row(null, "123") :: Row("234", null) :: Nil) spark.createDataFrame(rdd, schema).show
java.lang.RuntimeException: Error while decoding: java.lang.NullPointerException createexternalrow(if (isnull(input[0, string])) null else input[0, string].toString, if (isnull(input[1, string])) null else input[1, string].toString, StructField(a,StringType,false), StructField(b,StringType,false)) :- if (isnull(input[0, string])) null else input[0, string].toString : :- isnull(input[0, string]) : : +- input[0, string] : :- null : +- input[0, string].toString : +- input[0, string] +- if (isnull(input[1, string])) null else input[1, string].toString :- isnull(input[1, string]) : +- input[1, string] :- null +- input[1, string].toString +- input[1, string] at org.apache.spark.sql.catalyst.encoders.ExpressionEncoder.fromRow(ExpressionEncoder.scala:244) at org.apache.spark.sql.Dataset$$anonfun$org$apache$spark$sql$Dataset$$execute$1$1$$anonfun$apply$13.apply(Dataset.scala:2119) at org.apache.spark.sql.Dataset$$anonfun$org$apache$spark$sql$Dataset$$execute$1$1$$anonfun$apply$13.apply(Dataset.scala:2119) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33) at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186) at scala.collection.TraversableLike$class.map(TraversableLike.scala:234) at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:186) at org.apache.spark.sql.Dataset$$anonfun$org$apache$spark$sql$Dataset$$execute$1$1.apply(Dataset.scala:2119) at org.apache.spark.sql.execution.SQLExecution$.withNewExecutionId(SQLExecution.scala:57) at org.apache.spark.sql.Dataset.withNewExecutionId(Dataset.scala:2407) at org.apache.spark.sql.Dataset.org$apache$spark$sql$Dataset$$execute$1(Dataset.scala:2118) at org.apache.spark.sql.Dataset.org$apache$spark$sql$Dataset$$collect(Dataset.scala:2125) at org.apache.spark.sql.Dataset$$anonfun$head$1.apply(Dataset.scala:1859) at org.apache.spark.sql.Dataset$$anonfun$head$1.apply(Dataset.scala:1858) at org.apache.spark.sql.Dataset.withTypedCallback(Dataset.scala:2437) at org.apache.spark.sql.Dataset.head(Dataset.scala:1858) at org.apache.spark.sql.Dataset.take(Dataset.scala:2075) at org.apache.spark.sql.Dataset.showString(Dataset.scala:239) at org.apache.spark.sql.Dataset.show(Dataset.scala:530) at org.apache.spark.sql.Dataset.show(Dataset.scala:490) at org.apache.spark.sql.Dataset.show(Dataset.scala:499) ... 50 elided Caused by: java.lang.NullPointerException at org.apache.spark.sql.catalyst.expressions.GeneratedClass$SpecificSafeProjection.apply(Unknown Source) at org.apache.spark.sql.catalyst.encoders.ExpressionEncoder.fromRow(ExpressionEncoder.scala:241) ... 72 more
Attachments
Issue Links
- relates to
-
SPARK-13740 add null check for _verify_type in types.py
- Resolved
- links to