【问题标题】:Scala Spark Dataset change class typeScala Spark 数据集更改类类型
【发布时间】:2020-09-23 08:44:01
【问题描述】:

我有一个数据框,我创建为MyData1 的架构,然后我创建了一个列,以便新的数据框遵循MyData2 的架构。现在我想将新数据框作为数据集返回,但出现以下错误:

[info]   org.apache.spark.sql.AnalysisException: cannot resolve '`hashed`' given input columns: [id, description];
[info]   at org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:42)
[info]   at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$3.applyOrElse(CheckAnalysis.scala:110)
[info]   at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$3.applyOrElse(CheckAnalysis.scala:107)
[info]   at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:278)
[info]   at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:278)

这是我的代码:

import org.apache.spark.sql.{DataFrame, Dataset}

case class MyData1(id: String, description: String)


case class MyData2(id: String, description: String, hashed: String) 

object MyObject {

    def read(arg1: String, arg2: String): Dataset[MyData2] {
        var df: DataFrame = null
        val obj1 = new Matcher("cbutrer383", "e8f8chsdfd")
        val obj2 = new Matcher("cbutrer383", "g567g4rwew")
        val obj3 = new Matcher("cbutrer383", "567yr45e45")
        df = Seq(obj1, obj2, obj3).toDF("id", "description")

        df.withColumn("hashed", lit("hash"))

        val ds: Dataset[MyData2] = df.as[MyData2]
        ds
    }
}

我知道下一行可能有问题,但无法弄清楚

val ds: Dataset[MyData2] = df.as[MyData2]

我是新手,所以可能犯了一个基本错误。任何人都可以帮忙吗? TIA

【问题讨论】:

  • 你忘记分配df = df.withColumn(...
  • 你遇到了什么错误?
  • 尽量避免varnull 分配.. 使用Option | Some | None 相同

标签: scala apache-spark apache-spark-sql apache-spark-dataset


【解决方案1】:

您忘记将新创建的 Dataframe 分配给 df

df = df.withColumn("hashed", lit("hash"))

withcolumnSpark 文档说

通过添加列或替换现有数据集返回一个新数据集 具有相同名称的列。

【讨论】:

    【解决方案2】:

    您的阅读功能的更好版本如下,

    尽量避免null赋值,varreturn语句并不是真正需要的

    def read(arg1: String, arg2: String): Dataset[MyData2] = {
      val obj1 = new Matcher("cbutrer383", "e8f8chsdfd")
      val obj2 = new Matcher("cbutrer383", "g567g4rwew")
      val obj3 = new Matcher("cbutrer383", "567yr45e45")
      Seq(obj1, obj2, obj3).toDF("id", "description")
        .withColumn("hashed", lit("hash"))
        .as[MyData2]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多