对数据帧火花执行操作时出现空指针异常

Posted

技术标签:

【中文标题】对数据帧火花执行操作时出现空指针异常【英文标题】:Getting Null Pointer exception while performing operations on dataframe spark 【发布时间】:2018-05-17 07:50:50 【问题描述】:

我正在使用以下代码从 RDD 创建数据帧。我可以对 RDD 执行操作,并且 RDD 不为空。

我尝试了以下两种方法。 两者我都得到了同样的例外。

方法 1:使用 sparkSession.createDataframe() 构建数据集。

System.out.println("RDD Count: " + rdd.count());
        Dataset<Row> rows = applicationSession
                .getSparkSession().createDataFrame(rdd,  data.getSchema()).toDF(data.convertListToSeq(data.getColumnNames()));
        rows.createOrReplaceTempView(createStagingTableName(sparkTableName));
        rows.show();
        rows.printSchema();

方法 2:使用 Hive 上下文创建数据集。

System.out.println("RDD Count: " + rdd.count());
    System.out.println("Create view using HiveContext..");
    Dataset<Row> rows = applicationSession.gethiveContext().applySchema(rdd, data.getSchema());

我可以使用这两种方法打印上述数据集的架构。 不确定究竟是什么导致了空指针异常。

Show() 方法内部调用了抛出空指针异常的 take() 方法。 但是为什么这个数据集被填充为 NULL?如果 RDD 包含值,那么它不应该为空。

这是一种奇怪的行为。

以下是相同的日志。

RDD Count: 35

我还可以在本地模式下运行上面的代码,没有任何异常,它工作正常。

在 Yarn 上部署此代码后,我开始收到以下异常。

即使我能够注册相同的视图,我也能够创建数据框。 一旦我对这个数据集执行 rows.show() 或 rows.count() 操作,我就会收到以下错误。

Driver stacktrace:
    at org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$failJobAndIndependentStages(DAGScheduler.scala:1517)
    at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1505)
    at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1504)
    at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
    at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
    at org.apache.spark.scheduler.DAGScheduler.abortStage(DAGScheduler.scala:1504)
    at org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:814)
    at org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:814)
    at scala.Option.foreach(Option.scala:257)
    at org.apache.spark.scheduler.DAGScheduler.handleTaskSetFailed(DAGScheduler.scala:814)
    at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.doOnReceive(DAGScheduler.scala:1732)
    at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:1687)
    at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:1676)
    at org.apache.spark.util.EventLoop$$anon$1.run(EventLoop.scala:48)
    at org.apache.spark.scheduler.DAGScheduler.runJob(DAGScheduler.scala:630)
    at org.apache.spark.SparkContext.runJob(SparkContext.scala:2029)
    at org.apache.spark.SparkContext.runJob(SparkContext.scala:2050)
    at org.apache.spark.SparkContext.runJob(SparkContext.scala:2069)
    at org.apache.spark.sql.execution.SparkPlan.executeTake(SparkPlan.scala:336)
    at org.apache.spark.sql.execution.CollectLimitExec.executeCollect(limit.scala:38)
    at org.apache.spark.sql.Dataset.org$apache$spark$sql$Dataset$$collectFromPlan(Dataset.scala:2861)
    at org.apache.spark.sql.Dataset$$anonfun$head$1.apply(Dataset.scala:2150)
    at org.apache.spark.sql.Dataset$$anonfun$head$1.apply(Dataset.scala:2150)
    at org.apache.spark.sql.Dataset$$anonfun$55.apply(Dataset.scala:2842)
    at org.apache.spark.sql.execution.SQLExecution$.withNewExecutionId(SQLExecution.scala:65)
    at org.apache.spark.sql.Dataset.withAction(Dataset.scala:2841)
    at org.apache.spark.sql.Dataset.head(Dataset.scala:2150)
    at org.apache.spark.sql.Dataset.take(Dataset.scala:2363)
    at org.apache.spark.sql.Dataset.showString(Dataset.scala:241)
    at org.apache.spark.sql.Dataset.show(Dataset.scala:637)
    at org.apache.spark.sql.Dataset.show(Dataset.scala:596)
    at org.apache.spark.sql.Dataset.show(Dataset.scala:605)
Caused by: java.lang.NullPointerException
    at org.apache.spark.sql.SparkSession$$anonfun$3.apply(SparkSession.scala:469)
    at org.apache.spark.sql.SparkSession$$anonfun$3.apply(SparkSession.scala:469)
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:409)
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:409)
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:235)
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:228)
    at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$25.apply(RDD.scala:827)
    at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$25.apply(RDD.scala:827)
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:287)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
    at org.apache.spark.scheduler.Task.run(Task.scala:108)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:338)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

我在这里做错了吗? 请提出建议。

【问题讨论】:

【参考方案1】:

您可以发布数据框的架构吗?问题在于您正在使用的架构字符串和用于拆分架构字符串的分隔符。

【讨论】:

参考数据架构:test_table:StructType(StructField(test_table.column1,StringType,false), StructField(test_table.column2,StringType,false), StructField(test_table.column3,StringType,false), StructField (test_table.column4,StringType,false), StructField(test_table.column5,StringType,false)) 参考数据大小 : test_table : 35 root |-- column1: string (nullable = true) |-- column2: string (nullable = true ) |-- column3: string (nullable = true) |-- column4: string (nullable = true) |-- column5: string (nullable = true) 在本地模式下运行良好。不知道为什么它会在纱线上重新运行空数据帧。

以上是关于对数据帧火花执行操作时出现空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

从firebase检索时出现空指针异常[重复]

将项目加载到微调器时出现空指针异常

访问片段的子视图时出现空指针异常

加载属性文件时出现空指针异常

尝试使用 pyspark 从 S3 获取数据时出现空指针异常

从应用程序创建 SQLite 数据库时出现空指针异常 [重复]