如何从 case class 值重命名现有的 spark 数据框

How to rename existing spark dataframe from case class values

我通过读取 csv 创建了一个数据框。现在我想按照案例 class MyData.

中提到的重命名列和数据类型
case class MyData(
                   id: String,
                   name: String,
                   pcode: Integer,
                   loc: String)

val inputDF=spark.read.csv("/examples/example.csv")

inputDF.printSchema

scala> inputDF.printSchema
root
 |-- _c0: string (nullable = true)
 |-- _c1: string (nullable = true)
 |-- _c2: string (nullable = true)
 |-- _c3: string (nullable = true)

有什么办法可以将 inputDF 的模式更改为 class 情况下给出的模式,想要重命名该列并修改 数据类型也是如此。

有什么方法可以将 inputDF 的列和数据类型重命名为案例 class 中给出的名称。 _c0 重命名为 id,_c1 重命名为 name,_c2 重命名为 pcode,_c3 重命名为 loc 加上根据大小写格式化的数据类型 class。 谁能帮我解决这个问题。

所述,您可以先从案例class:

中获取一个Spark schema
import org.apache.spark.sql.Encoders

val mySchema = Encoders.product[MyData].schema

// scala> mySchema.printTreeString
// root
//  |-- id: string (nullable = true)
//  |-- name: string (nullable = true)
//  |-- pcode: integer (nullable = true)
//  |-- loc: string (nullable = true)

然后在读取 CSV 文件时提供它。使用as[MyData]获取类型化数据集:

val inputDF = spark.read
                .schema(mySchema)
                .csv("/examples/example.csv")
                .as[MyData]

即使没有 as[MyData],无类型数据框仍将包含所有 correctly-named 列及其各自的类型:

scala> val inputDF = spark.read.schema(mySchema).csv("/tmp/example.csv")
inputDF: org.apache.spark.sql.DataFrame = [id: string, name: string ... 2 more fields]

scala> inputDF.printSchema
root
 |-- id: string (nullable = true)
 |-- name: string (nullable = true)
 |-- pcode: integer (nullable = true)
 |-- loc: string (nullable = true)

scala> val typedInputDF = inputDF.as[MyData]
typedInputDF: org.apache.spark.sql.Dataset[MyData] = [id: string, name: string ... 2 more fields]

scala> typedInputDF.printSchema
root
 |-- id: string (nullable = true)
 |-- name: string (nullable = true)
 |-- pcode: integer (nullable = true)
 |-- loc: string (nullable = true)