【问题标题】:Mismatched Array type (scala.Array vs Array) for an RDD[Array[String]]RDD[Array[String]] 的数组类型不匹配(scala.Array vs Array)
【发布时间】:2019-01-09 17:27:26
【问题描述】:

我正在尝试将数据帧转换为 spark 中的 RDD[Array[String]],目前我使用以下方法:

case class Array[String](c0:Long, c1:Integer, c2:Long, c3:String, c4:Integer, c5:Integer, c6:Integer)

val newData = df.distinct.map {
  case Row(c0:Long, c1:Integer, c2:Long, c3:String, c4:Integer, c5:Integer, c6:Integer) => Array[String](c0:Long, c1:Integer, c2:Long, c3:String, c4:Integer, c5:Integer, c6:Integer)
}

val newRDD = newData.rdd

这给了我从数据帧到 RDD[Array[String]] 的转换——但是当我将它包装在一个函数中时;像这样:

 def caseNewRDD(df: DataFrame): RDD[Array[String]] ={
    case class Array[String](c0:Long, c1:Integer, c2:Long, c3:String, c4:Integer, c5:Integer, c6:Integer)
    val newData = df.distinct.map {
      case org.apache.spark.sql.Row(c0:Long, c1:Integer, c2:Long, c3:String, c4:Integer, c5:Integer, c6:Integer) => Array[String](c0:Long, c1:Integer, c2:Long, c3:String, c4:Integer, c5:Integer, c6:Integer)
    }
    val newRDD = newData.rdd
    newRDD
  }

我收到以下错误:

类型的表达 org.apache.spark.rdd.RDD[Array[scala.Predef.String]] 不符合 到预期类型 org.apache.spark.rdd.RDD[scala.Array[scala.Predef.String]]

我猜我生成的 Array 类型不符合要求,但我不知道为什么。

任何帮助将不胜感激。

【问题讨论】:

    标签: scala apache-spark dataframe rdd


    【解决方案1】:

    你不能像那样在 Scala 中转换类型。

    case class Array[String](c0:Long, c1:Integer, c2:Long, c3:String, c4:Integer, c5:Integer, c6:Integer)
    

    意思是:创建NEW类型Array,类型别名String。你想要完成的是:

    def caseNewRDD(df: DataFrame): RDD[Array[String]] = {
      df.distinct.map {
        case Row(c0:Long, c1:Integer, c2:Long, c3:String, c4:Integer, c5:Integer, c6:Integer) => 
          Array(c0.toString, c1.toString, c2.toString, c3, c4.toString, c5.toString, c6.toString)
      }.rdd
    }
    

    也就是说 - 我明确地将我的类型转换为 Strings 而没有实际创建新类型。

    【讨论】:

    • 我正在尝试测试您的解决方案,起初我收到错误 [无法找到存储在数据集中的类型的编码器。] 所以我导入了以下内容 [val sparkSession: SparkSession = ??? && import sparkSession.implicits._] -> 现在我得到错误 [scala.NotImplementedError: an implementation is missing]
    • 我刚刚意识到 SparkContext 已用于完整脚本,因此在这种情况下启动 SparkSession 将不起作用 - 尽管我不确定如何在没有它的情况下实现您的解决方案
    • 好的,所以我已经找出了 SparkSession 错误,但是我的代码仍然崩溃,尽管我相信这可能是由于与您在答案中定义的函数无关的另一个原因,所以我要接受您的解决方案。
    猜你喜欢
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    相关资源
    最近更新 更多