繁体   English   中英

spark-在Spark中读取Hive表时从RDD [Row]中提取元素

[英]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

非常感谢

getAs[String](i)

get(i).asInstanceOf[String]

因此,这只是类型转换。 toString 不是

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM