[英]spark - extract elements from an RDD[Row] when reading Hive table in Spark
我打算使用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)
对我来说,这两行做的事情完全相同:对于每一行,我将第ith个元素作为字符串获取,并将其放入ArrayBuffer中,该ArrayBuffer最后出现在Array中。
但是,这两种方法有不同的结果。
第一行效果很好。 数据能够正确保存在HDFS上。
当我使用第二行保存数据时抛出了错误:
错误ApplicationMaster:用户类引发异常:org.apache.spark.SparkException:作业由于阶段失败而中止:阶段3.0中的任务56失败4次,最近一次失败:阶段3.0中的任务56.3丢失(TID 98,ip-172- 31-18-87.ec2.internal,执行程序6):java.lang.NullPointerException
因此,我想知道两者之间是否存在某些内在差异
getAs[String](i)
和
get(i).toString
?
非常感谢
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.