将每一行写为foreach迭代内的字符串而没有NullPointerException?

时间:2019-05-15 16:01:14

标签: java scala apache-spark apache-spark-sql

在替换值之后,尝试捕获由foreach迭代在数据帧的所有行中生成的字符串值。这是我正在使用的代码块的摘录,对其进行了简化,但这与所使用的逻辑相同。最后两行都给出了NullPointerException:

{
    val finalResult = hiveContext.sql("""SELECT * from """ + temptableName) 

    if (finalResult.count() > 0) {
    finalResult.foreach { row => 

        RealtimeUtil.loadStreamProperties("TestFlow.properties")
           val tag1 = row.getAs("new_val1").asInstanceOf[String]
           val tag2 = row.getAs("new_val2").asInstanceOf[String]


        val string = """This is a template string with some value
            "-Name":"TAG1", "#text":"****",
            "-Name":"TAG2", "#text":"****"
            """

        val string2 = string
        .replace(""""-Name":"TAG1", "#text":"****"""", """"-Name":"TAG1", "#text":"""" + new_val1 +"\"")
        .replace(""""-Name":"TAG2", "#text":"****"""", """"-Name":"TAG2", "#text":"""" + new_val2 +"\"")

        hiveContext.sql("""insert into table testdb.final_table values ("""" + string2 + ")""")
        \\above statement failing with NPE
        val someDF = Seq((1, string2)).toDF("seq", "value").coalesce(1).select("value").write.format("text").mode("append").save("/tmp/output")
        \\above statement failing with NPE
        } 
    }
}

对于Spark和Scala来说是完全陌生的,只有很少的Java经验,仍然在学习绳索,如果有人可以帮助并解释为什么获得NullPointerException那就好了。我该如何解决该问题并仍然提取string2值并将其写入每个微型批次的hdfs中?我正在寻找有关如何从foreach循环DF内部捕获“ string2”的解决方案。 (假设所有初始化均已完成,并且temptableName是从具有诸如new_val1,new_val2之类的字段的数据帧创建的tempView)

0 个答案:

没有答案