spark和scala中Dataframe的cast模式

k4emjkb1  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(1100)

我想使用spark和scala转换dataframe的模式来更改某些列的类型。
具体来说,我尝试使用as[u]函数,它的描述是:“返回一个新的数据集,其中每个记录都Map到指定的类型。用于Map列的方法取决于“u”的类型
原则上这正是我想要的,但我不能让它工作。
下面是一个简单的例子https://github.com/apache/spark/blob/master/sql/core/src/test/scala/org/apache/spark/sql/datasetsuite.scala

// definition of data
    val data = Seq(("a", 1), ("b", 2)).toDF("a", "b")

正如预期的那样,数据模式是:

root
     |-- a: string (nullable = true)
     |-- b: integer (nullable = false)

我想把“b”栏改成双栏。所以我尝试以下方法:

import session.implicits._;

    println(" --------------------------- Casting using (String Double)")

    val data_TupleCast=data.as[(String, Double)]
    data_TupleCast.show()
    data_TupleCast.printSchema()

    println(" --------------------------- Casting using ClassData_Double")

    case class ClassData_Double(a: String, b: Double)

    val data_ClassCast= data.as[ClassData_Double]
    data_ClassCast.show()
    data_ClassCast.printSchema()

根据我对as[u]的定义的理解,新的dataframes应该具有以下模式

root
     |-- a: string (nullable = true)
     |-- b: double (nullable = false)

但是输出是

--------------------------- Casting using (String Double)
    +---+---+
    |  a|  b|
    +---+---+
    |  a|  1|
    |  b|  2|
    +---+---+

    root
     |-- a: string (nullable = true)
     |-- b: integer (nullable = false)

     --------------------------- Casting using ClassData_Double
    +---+---+
    |  a|  b|
    +---+---+
    |  a|  1|
    |  b|  2|
    +---+---+

    root
     |-- a: string (nullable = true)
     |-- b: integer (nullable = false)

这表明“b”列并没有被转换成双精度。
有什么关于我做错了什么的暗示吗?
顺便说一句:我知道上一篇文章“如何在sparksql的dataframe中更改列类型?”(请参阅how to change column types in sparksql的dataframe?)。我知道我可以一次更改一个列的类型,但我正在寻找一种更通用的解决方案,可以一次性更改整个数据的模式(我正在尝试理解这个过程中的spark)。

4ktjp1zp

4ktjp1zp1#

好吧,因为函数是链式的,spark执行延迟求值,所以它实际上会在一次操作中更改整个数据的模式,即使您将其编写为一次更改一列,如下所示:

import spark.implicits._

df.withColumn("x", 'x.cast(DoubleType)).withColumn("y", 'y.cast(StringType))...

作为替代,我想你可以 map 一步到位,比如:

df.map{t => (t._1, t._2.asInstanceOf[Double], t._3.asInstanceOf[], ...)}

相关问题