dataframe - Spark-scala更改数据框中列的数据类型
问题描述
条件是:以Data-C开头的列名是StringType列,Data-D是DateType列,Data-N是DoubleType列。我有一个数据框,其中所有列的数据类型都是一个字符串,所以我试图以这样的方式更新它们的数据类型:
import org.apache.spark.sql.functions._
import sparkSession.sqlContext.implicits._
val diff_set = Seq("col7", "col8", "col15", "Data-C-col1", "Data-C-col3", "Data-N-col2", "Data-N-col4", "Data-D-col16", "Data-D-col18", "Data-D-col20").toSet
var df = (1 to 10).toDF
df = df.select(df.columns.map(c => col(c).as(c)) ++ diff_set.map(c => lit(null).cast("string").as(c)): _*)
df.printSchema()
// This foreach loop yields slow performance
df.columns.foreach(x => {
if (x.startsWith("Data-C")) {
df = df.withColumn(x, col(x).cast(StringType))
} else if (x.startsWith("Data-D")) {
df = df.withColumn(x, col(x).cast(DateType))
} else if (x.startsWith("Data-N")) {
df = df.withColumn(x, col(x).cast(DoubleType))
}
}
)
df.printSchema()
这可以在 scala-spark 中更优雅、更有效地完成(性能方面)吗?
解决方案
检查下面的代码。
scala> df.printSchema
root
|-- value: integer (nullable = false)
|-- Data-C-col1: string (nullable = true)
|-- Data-D-col18: string (nullable = true)
|-- Data-N-col4: string (nullable = true)
|-- Data-N-col2: string (nullable = true)
|-- col15: string (nullable = true)
|-- Data-D-col16: string (nullable = true)
|-- Data-D-col20: string (nullable = true)
|-- col8: string (nullable = true)
|-- col7: string (nullable = true)
|-- Data-C-col3: string (nullable = true)
val colum_datatype_mapping =
Map(
"Data-C" -> "string",
"Data-D" -> "date",
"Data-N" -> "double"
)
val columns = df
.columns
.map { c =>
val key = c.split("-").init.mkString("-")
if(colum_datatype_mapping.contains(key))
col(c).cast(colum_datatype_mapping(key))
else
col(c)
}
scala> df.select(columns:_*).printSchema
root
|-- value: integer (nullable = false)
|-- Data-C-col1: string (nullable = true)
|-- Data-D-col18: date (nullable = true)
|-- Data-N-col4: double (nullable = true)
|-- Data-N-col2: double (nullable = true)
|-- col15: string (nullable = true)
|-- Data-D-col16: date (nullable = true)
|-- Data-D-col20: date (nullable = true)
|-- col8: string (nullable = true)
|-- col7: string (nullable = true)
|-- Data-C-col3: string (nullable = true)
推荐阅读
- c++ - 在向公众发布的库中使用 std::experimental 功能是否安全且合法?
- amazon-web-services - 如何将标头添加到 CloudFront 响应?
- c++ - 为什么除了可变参数模板之外还要重载一个参数模板函数?
- node.js - 如何从创建重播mongodb节点js中删除_id
- android - 无法实现 OnBackPress
- wordpress - 与 Google 日历和 WooCommerce 预订同步问题
- html - 如何将一个 div 覆盖在另一个 div 之上?
- opengl - 如何将颜色的色调转移到相反的方向
- python-3.x - Python Kivy - 使椭圆调整到可用空间
- flutter - PageStorageKey 未在导航之间加载