spark-在spark中读取配置单元表时从rdd[row]中提取元素

qv7cva1a  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(515)

我打算用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

?
非常感谢

c8ib6hqw

c8ib6hqw1#

getAs[String](i) 与相同

get(i).asInstanceOf[String]

因此,它只是一个类型铸造。 toString 不是。

相关问题