如何从 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)
我通过读取 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。 谁能帮我解决这个问题。
如
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)