在foreach()内创建df时出现空指针异常

e0bqpujr  于 2021-05-27  发布在  Spark
关注(0)|答案(3)|浏览(661)

我必须从s3读取某些文件,因此我创建了一个csv,其中包含s3上这些文件的路径。我正在阅读使用以下代码创建的csv文件:

val listofFilesRDD = sparkSession.read.textFile("s3://"+ file)

这很有效。然后我尝试读取这些路径中的每一条并创建Dataframe,如:

listofFilesRDD.foreach(iter => {
  val pathDF = sparkSession.read
    .schema(testSchema)
    .option("headers", true)
    .csv("s3://"+iter)

  pathDF.printSchema()
})

但是,上面的代码给出了nullpointerexception。
那么,如何修复上述代码?

oiopk7p5

oiopk7p51#

您不能访问rdd中的rdd!这是唯一的规则!你必须做些别的事情来让你的逻辑工作!
您可以在这里找到更多关于它的信息:scala spark中的nullpointerexception,似乎是由集合类型引起的?

2ic8powd

2ic8powd2#

您可以如下解决上述问题:您只需创建一个s3文件路径数组,并在该数组上迭代,然后在该数组中创建df,如下所示

val listofFilesRDD = sparkSession.read.textFile("s3://"+ file)
val listOfPaths = listofFilesRDD.collect()

    listOfPaths.foreach(iter => {
    val pathDF = sparkSession.read
    .schema(testSchema)
    .option("headers", true)
    .csv("s3://"+iter)

pathDF.printSchema()
})
roqulrg3

roqulrg33#

如果有人遇到Dataframe问题,可以解决这个问题。

def parameterjsonParser(queryDF:DataFrame,spark:SparkSession): Unit ={
        queryDF.show()
        val otherDF=queryDF.collect()
        otherDF.foreach { row =>
          row.toSeq.foreach { col =>
            println(col)
            mainJsonParser(col.toString,spark)
          }
        }

谢谢你@sandeep purohit

相关问题