Michael Heuer created SPARK-25587: ------------------------------------- Summary: NPE in Dataset when reading from Parquet as Product Key: SPARK-25587 URL: https://issues.apache.org/jira/browse/SPARK-25587 Project: Spark Issue Type: Bug Components: SQL Affects Versions: 2.4.0 Environment: Spark version 2.4.0 (RC2).
{noformat} $ spark-submit --version Welcome to ____ __ / __/__ ___ _____/ /__ _\ \/ _ \/ _ `/ __/ '_/ /___/ .__/\_,_/_/ /_/\_\ version 2.4.0 /_/ Using Scala version 2.11.12, Java HotSpot(TM) 64-Bit Server VM, 1.8.0_181 Branch Compiled by user on 2018-09-27T14:50:10Z Revision Url Type --help for more information. {noformat} Reporter: Michael Heuer In an attempt to replicate the following issue in ADAM, a library downstream of Spark https://github.com/bigdatagenomics/adam/issues/2058 the following Spark Shell script throws NPE when attempting to read from Parquet. {code:scala} sc.setLogLevel("INFO") import spark.implicits._ case class Inner( names: Seq[String] = Seq() ) extends Product { def productArity: Int = 1 def productElement(i: Int): Any = i match { case 0 => names } def canEqual(that: Any): Boolean = that match { case Inner => true case _ => false } } case class Outer( inners: Seq[Inner] = Seq() ) extends Product { def productArity: Int = 1 def productElement(i: Int): Any = i match { case 0 => inners } def canEqual(that: Any): Boolean = that match { case Outer => true case _ => false } } val inner = Inner(Seq("name0", "name1")) val outer = Outer(Seq(inner)) val dataset = sc.parallelize(Seq(outer)).toDS() val path = "outers.parquet" dataset.toDF().write.format("parquet").save(path) val roundtrip = spark.read.parquet(path).as[Outer] roundtrip.first {code} Stack trace {noformat} $ spark-shell -i failure.scala ... 2018-10-01 16:57:48 INFO ParquetWriteSupport:54 - Initialized Parquet WriteSupport with Catalyst schema: { "type" : "struct", "fields" : [ { "name" : "inners", "type" : { "type" : "array", "elementType" : { "type" : "struct", "fields" : [ { "name" : "names", "type" : { "type" : "array", "elementType" : "string", "containsNull" : true }, "nullable" : true, "metadata" : { } } ] }, "containsNull" : true }, "nullable" : true, "metadata" : { } } ] } and corresponding Parquet message type: message spark_schema { optional group inners (LIST) { repeated group list { optional group element { optional group names (LIST) { repeated group list { optional binary element (UTF8); } } } } } } 16:57:48 INFO InternalParquetRecordWriter:165 - Flushing mem columnStore to file. allocated memory: 0 2018-10-01 16:57:48 INFO InternalParquetRecordWriter:165 - Flushing mem columnStore to file. allocated memory: 26 ... 2018-10-01 16:57:49 INFO FileSourceStrategy:54 - Output Data Schema: struct<inners: array<struct<names:array<string>>>> 2018-10-01 16:57:49 INFO FileSourceScanExec:54 - Pushed Filters: java.lang.NullPointerException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.spark.sql.catalyst.encoders.OuterScopes$$anonfun$getOuterScope$1.apply(OuterScopes.scala:70) at org.apache.spark.sql.catalyst.expressions.objects.NewInstance$$anonfun$10.apply(objects.scala:485) at org.apache.spark.sql.catalyst.expressions.objects.NewInstance$$anonfun$10.apply(objects.scala:485) at scala.Option.map(Option.scala:146) at org.apache.spark.sql.catalyst.expressions.objects.NewInstance.doGenCode(objects.scala:485) at org.apache.spark.sql.catalyst.expressions.Expression$$anonfun$genCode$2.apply(Expression.scala:108) at org.apache.spark.sql.catalyst.expressions.Expression$$anonfun$genCode$2.apply(Expression.scala:105) at scala.Option.getOrElse(Option.scala:121) at org.apache.spark.sql.catalyst.expressions.Expression.genCode(Expression.scala:105) at org.apache.spark.sql.catalyst.expressions.If.doGenCode(conditionalExpressions.scala:70) at org.apache.spark.sql.catalyst.expressions.Expression$$anonfun$genCode$2.apply(Expression.scala:108) at org.apache.spark.sql.catalyst.expressions.Expression$$anonfun$genCode$2.apply(Expression.scala:105) at scala.Option.getOrElse(Option.scala:121) at org.apache.spark.sql.catalyst.expressions.Expression.genCode(Expression.scala:105) at org.apache.spark.sql.catalyst.expressions.objects.MapObjects.doGenCode(objects.scala:796) at org.apache.spark.sql.catalyst.expressions.Expression$$anonfun$genCode$2.apply(Expression.scala:108) at org.apache.spark.sql.catalyst.expressions.Expression$$anonfun$genCode$2.apply(Expression.scala:105) at scala.Option.getOrElse(Option.scala:121) at org.apache.spark.sql.catalyst.expressions.Expression.genCode(Expression.scala:105) at org.apache.spark.sql.catalyst.expressions.objects.InvokeLike$$anonfun$3.apply(objects.scala:99) at org.apache.spark.sql.catalyst.expressions.objects.InvokeLike$$anonfun$3.apply(objects.scala:98) 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.immutable.List.foreach(List.scala:392) at scala.collection.TraversableLike$class.map(TraversableLike.scala:234) at scala.collection.immutable.List.map(List.scala:296) at org.apache.spark.sql.catalyst.expressions.objects.InvokeLike$class.prepareArguments(objects.scala:98) at org.apache.spark.sql.catalyst.expressions.objects.NewInstance.prepareArguments(objects.scala:431) at org.apache.spark.sql.catalyst.expressions.objects.NewInstance.doGenCode(objects.scala:483) at org.apache.spark.sql.catalyst.expressions.Expression$$anonfun$genCode$2.apply(Expression.scala:108) at org.apache.spark.sql.catalyst.expressions.Expression$$anonfun$genCode$2.apply(Expression.scala:105) at scala.Option.getOrElse(Option.scala:121) at org.apache.spark.sql.catalyst.expressions.Expression.genCode(Expression.scala:105) at org.apache.spark.sql.catalyst.expressions.codegen.GenerateSafeProjection$$anonfun$3.apply(GenerateSafeProjection.scala:155) at org.apache.spark.sql.catalyst.expressions.codegen.GenerateSafeProjection$$anonfun$3.apply(GenerateSafeProjection.scala:152) 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.immutable.List.foreach(List.scala:392) at scala.collection.TraversableLike$class.map(TraversableLike.scala:234) at scala.collection.immutable.List.map(List.scala:296) at org.apache.spark.sql.catalyst.expressions.codegen.GenerateSafeProjection$.create(GenerateSafeProjection.scala:152) at org.apache.spark.sql.catalyst.expressions.codegen.GenerateSafeProjection$.create(GenerateSafeProjection.scala:38) at org.apache.spark.sql.catalyst.expressions.codegen.CodeGenerator.generate(CodeGenerator.scala:1193) at org.apache.spark.sql.Dataset.org$apache$spark$sql$Dataset$$collectFromPlan(Dataset.scala:3383) at org.apache.spark.sql.Dataset$$anonfun$head$1.apply(Dataset.scala:2545) at org.apache.spark.sql.Dataset$$anonfun$head$1.apply(Dataset.scala:2545) at org.apache.spark.sql.Dataset$$anonfun$53.apply(Dataset.scala:3365) at org.apache.spark.sql.execution.SQLExecution$$anonfun$withNewExecutionId$1.apply(SQLExecution.scala:78) at org.apache.spark.sql.execution.SQLExecution$.withSQLConfPropagated(SQLExecution.scala:125) at org.apache.spark.sql.execution.SQLExecution$.withNewExecutionId(SQLExecution.scala:73) at org.apache.spark.sql.Dataset.withAction(Dataset.scala:3364) at org.apache.spark.sql.Dataset.head(Dataset.scala:2545) at org.apache.spark.sql.Dataset.head(Dataset.scala:2552) at org.apache.spark.sql.Dataset.first(Dataset.scala:2559) ... 59 elided {noformat} See also pull request https://github.com/bigdatagenomics/adam/pull/2056 -- This message was sent by Atlassian JIRA (v7.6.3#76005) --------------------------------------------------------------------- To unsubscribe, e-mail: issues-unsubscr...@spark.apache.org For additional commands, e-mail: issues-h...@spark.apache.org