【问题标题】:Error while iterating a dataframe using Java Spark foreach function使用 Java Spark foreach 函数迭代数据帧时出错
【发布时间】:2021-12-18 02:16:22
【问题描述】:

已编辑

我正在尝试遍历数据框以创建另一个数据框。在这个例子中,我没有使用第一个数据,它只是为了展示我想要做什么。但是,我们的想法是使用第一个基于第一个数据生成一个更大的新数据。

无论我在 void 函数中尝试什么,我总是在 foreach 中得到错误。

要迭代的示例数据框:

Dataset<Row> obtencionRents = spark.createDataFrame(Arrays.asList(
        new testRentabilidades("0000A0","PORTAL","4-ANUAL","asdasd","asdasd"),
        new testRentabilidades("00A00","PORTAL","","asdasd","sdasd"),
        new testRentabilidades("00A","PORTAL","4-ANUAL","asdasd","asdasd")
), testRentabilidades.class);

用于迭代示例数据帧的 Foreach 函数:

obtencionRents.toJavaRDD().foreach(new VoidFunction<Row>() {
        public void call(Row r) throws Exception {

           //add registers to new collection/arraylist/etc.
        }
    });

我遇到的错误:

Driver stacktrace:
2021-11-03 17:34:41 INFO  DAGScheduler:54 - Job 0 failed: foreach at CargarRentabilidades.java:154, took 0,812094 s
Exception in thread "main" org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 1 times, most recent failure: Lost task 0.0 in stage 0.0 (TID 0, localhost, executor driver): java.lang.NullPointerException
    at org.apache.spark.sql.SparkSession.sessionState$lzycompute(SparkSession.scala:139)
    at org.apache.spark.sql.SparkSession.sessionState(SparkSession.scala:137)
    at org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:73)
    at org.apache.spark.sql.SparkSession.createDataFrame(SparkSession.scala:419)
    at batchload.proceso.builder.CargarRentabilidades$1.call(CargarRentabilidades.java:157)
    at batchload.proceso.builder.CargarRentabilidades$1.call(CargarRentabilidades.java:154)
    at org.apache.spark.api.java.JavaRDDLike$$anonfun$foreach$1.apply(JavaRDDLike.scala:351)
    at org.apache.spark.api.java.JavaRDDLike$$anonfun$foreach$1.apply(JavaRDDLike.scala:351)
    at scala.collection.Iterator$class.foreach(Iterator.scala:893)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1336)
    at org.apache.spark.rdd.RDD$$anonfun$foreach$1$$anonfun$apply$28.apply(RDD.scala:921)
    at org.apache.spark.rdd.RDD$$anonfun$foreach$1$$anonfun$apply$28.apply(RDD.scala:921)
    at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:2067)
    at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:2067)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
    at org.apache.spark.scheduler.Task.run(Task.scala:109)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:345)
    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)

Driver stacktrace:
    at org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$failJobAndIndependentStages(DAGScheduler.scala:1599)
    at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1587)
    at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1586)
    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:1586)
    at org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:831)
    at org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:831)
    at scala.Option.foreach(Option.scala:257)
    at org.apache.spark.scheduler.DAGScheduler.handleTaskSetFailed(DAGScheduler.scala:831)
    at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.doOnReceive(DAGScheduler.scala:1820)
    at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:1769)
    at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:1758)
    at org.apache.spark.util.EventLoop$$anon$1.run(EventLoop.scala:48)
    at org.apache.spark.scheduler.DAGScheduler.runJob(DAGScheduler.scala:642)
    at org.apache.spark.SparkContext.runJob(SparkContext.scala:2027)
    at org.apache.spark.SparkContext.runJob(SparkContext.scala:2048)
    at org.apache.spark.SparkContext.runJob(SparkContext.scala:2067)
    at org.apache.spark.SparkContext.runJob(SparkContext.scala:2092)
    at org.apache.spark.rdd.RDD$$anonfun$foreach$1.apply(RDD.scala:921)
    at org.apache.spark.rdd.RDD$$anonfun$foreach$1.apply(RDD.scala:919)
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112)
    at org.apache.spark.rdd.RDD.withScope(RDD.scala:363)
    at org.apache.spark.rdd.RDD.foreach(RDD.scala:919)
    at org.apache.spark.api.java.JavaRDDLike$class.foreach(JavaRDDLike.scala:351)
    at org.apache.spark.api.java.AbstractJavaRDDLike.foreach(JavaRDDLike.scala:45)
    at batchload.proceso.builder.CargarRentabilidades.transformacionRentabilidades(CargarRentabilidades.java:154)
    at batchload.proceso.builder.CargarRentabilidades.coleccionRentabilidades(CargarRentabilidades.java:78)
    at batchload.proceso.builder.CargarRentabilidades.coleccionCargaRentabilidades(CargarRentabilidades.java:52)
    at batchload.proceso.MainBatch.init(MainBatch.java:59)
    at batchload.BatchloadRentabilidades.main(BatchloadRentabilidades.java:24)
Caused by: java.lang.NullPointerException
    at org.apache.spark.sql.SparkSession.sessionState$lzycompute(SparkSession.scala:139)
    at org.apache.spark.sql.SparkSession.sessionState(SparkSession.scala:137)
    at org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:73)
    at org.apache.spark.sql.SparkSession.createDataFrame(SparkSession.scala:419)
    at batchload.proceso.builder.CargarRentabilidades$1.call(CargarRentabilidades.java:157)
    at batchload.proceso.builder.CargarRentabilidades$1.call(CargarRentabilidades.java:154)
    at org.apache.spark.api.java.JavaRDDLike$$anonfun$foreach$1.apply(JavaRDDLike.scala:351)
    at org.apache.spark.api.java.JavaRDDLike$$anonfun$foreach$1.apply(JavaRDDLike.scala:351)
    at scala.collection.Iterator$class.foreach(Iterator.scala:893)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1336)
    at org.apache.spark.rdd.RDD$$anonfun$foreach$1$$anonfun$apply$28.apply(RDD.scala:921)
    at org.apache.spark.rdd.RDD$$anonfun$foreach$1$$anonfun$apply$28.apply(RDD.scala:921)
    at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:2067)
    at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:2067)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
    at org.apache.spark.scheduler.Task.run(Task.scala:109)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:345)
    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)

版本:

mongo-spark-connector_2.11-2.3.0 Java 1.8 IntelliJ 2021 1.2 社区 Spark 库版本 2.11

我正在使用的其他依赖版本:

hadoop 2.7, spark 2.3.0, java driver 2.7, spark catalyst,core,hive,sql ....所有 2.11:2.3.0, scala scala-library:2.11.12

坚持这一点,任何帮助都非常受欢迎

谢谢!

【问题讨论】:

    标签: java dataframe apache-spark foreach dataset


    【解决方案1】:

    这可能是由于序列化问题。 您可以尝试将您的匿名函数转换为类的静态方法吗?

    【讨论】:

    • 谢谢解答,我去试试
    • 无法使其成为静态,因为我在函数和类中使用了 spark 会话,并且由于不可序列化而引发异常,我将不得不尝试其他方式。从第一个数据帧中获取数据,将其转换为我可以逐行读取的数据,然后使用这些值构建一个新的更大的数据帧。我用“foreachrow”函数尝试的所有东西都会抛出那个奇怪的异常。
    • 没能成功。最后,我将数据框转换为列表,然后使用 for 循环获取列表的所有行: List newList = df.collectAsList();
    猜你喜欢
    • 1970-01-01
    • 2021-12-23
    • 2018-11-09
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2019-05-13
    • 2018-03-12
    • 2017-09-18
    相关资源
    最近更新 更多