【发布时间】:2018-11-07 12:50:48
【问题描述】:
我打算使用 scala 在 spark 中读取 Hive 表,并从中提取部分/全部字段,然后将数据保存到 HDFS。
我的代码如下:
val data = spark.sql("select * from table1 limit 1000")
val new_rdd = data.rdd.map(row => {
var arr = new ArrayBuffer[String]
val len = row.size
for(i <- 0 to len-1) arr.+=(row.getAs[String](i))
arr.toArray
})
new_rdd.take(10).foreach(println)
new_rdd.map(_.mkString("\t")).saveAsTextFile(dataOutputPath)
上面的块是最终起作用的块。
我写了另一个版本,这行:
for(i <- 0 to len-1) arr.+=(row.getAs[String](i))
被这一行取代:
for(i <- 0 to len-1) arr.+=(row.get(i).toString)
对我来说,两行都做了完全相同的事情:对于每一行,我将第 i 个元素作为一个字符串,并将其放入 ArrayBuffer 中,最后是一个 Array。
但是,这两种方法有不同的结果。
第一行运行良好。数据能够正确保存在 HDFS 上。
如果使用第二行,当我要保存数据时抛出错误:
ERROR ApplicationMaster:用户类抛出异常: org.apache.spark.SparkException:作业因阶段失败而中止:任务 56 在 stage 3.0 中失败了 4 次,最近一次失败:Lost task 56.3 in stage 3.0(TID 98,ip-172-31-18-87.ec2.internal,执行器 6): java.lang.NullPointerException
因此,我想知道两者之间是否存在一些内在差异
getAs[String](i)
和
get(i).toString
?
非常感谢
【问题讨论】:
标签: scala apache-spark hadoop hive