我打算用scala读取spark中的一个配置单元表,从中提取部分/全部字段,然后将数据保存到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中,最后一个数组就是它。
然而,这两种方法有不同的结果。
第一行很好用。数据能够正确地保存在hdfs上。
如果使用第二行保存数据时引发错误:
错误applicationmaster:用户类引发异常:org.apache.spark.sparkexception:由于阶段失败而中止作业:阶段3.0中的任务56失败了4次,最近的失败:阶段3.0中的任务56.3丢失(tid 98,ip-172-31-18-87.ec2.internal,executor 6):java.lang.nullpointerexception
因此,我想知道他们之间是否有一些内在的差异
getAs[String](i)
以及
get(i).toString
?
非常感谢
1条答案
按热度按时间c8ib6hqw1#
getAs[String](i)
与相同因此,它只是一个类型铸造。
toString
不是。