【问题标题】:spark - extract elements from an RDD[Row] when reading Hive table in Sparkspark - 在 Spark 中读取 Hive 表时从 RDD[Row] 中提取元素
【发布时间】:2018-11-07 12:50:48
【问题描述】:

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

对我来说,两行都做了完全相同的事情:对于每一行,我将第 i 个元素作为一个字符串,并将其放入 ArrayBuffer 中,最后是一个 Array。

但是,这两种方法有不同的结果。

第一行运行良好。数据能够正确保存在 HDFS 上。

如果使用第二行,当我要保存数据时抛出错误:

ERROR ApplicationMaster:用户类抛出异常: org.apache.spark.SparkException:作业因阶段失败而中止:任务 56 在 stage 3.0 中失败了 4 次,最近一次失败:Lost task 56.3 in stage 3.0(TID 98,ip-172-31-18-87.ec2.internal,执行器 6): java.lang.NullPointerException

因此,我想知道两者之间是否存在一些内在差异

getAs[String](i) 

get(i).toString

?

非常感谢

【问题讨论】:

    标签: scala apache-spark hadoop hive


    【解决方案1】:

    getAs[String](i)

    相同
    get(i).asInstanceOf[String]
    

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

    【讨论】:

      猜你喜欢
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 2020-02-06
      相关资源
      最近更新 更多