gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:31:24 26 4
gpt4 key购买 nike

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

上面的 block 是最终起作用的 block 。

我写了另一个版本,其中这一行:
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: User class threw exception: org.apache.spark.SparkException: Job aborted due to stage failure: Task 56 in stage 3.0 failed 4 times, most recent failure: Lost task 56.3 in stage 3.0 (TID 98, ip-172-31-18-87.ec2.internal, executor 6): java.lang.NullPointerException



因此,我想知道两者之间是否存在一些内在差异
getAs[String](i) 


get(i).toString

?

非常感谢

最佳答案

getAs[String](i)是相同的

get(i).asInstanceOf[String]

因此它只是一个类型转换。 toString is not .

关于scala - spark - 在 Spark 中读取 Hive 表时从 RDD[Row] 中提取元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53189804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com