首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Spark SQL的DataFrame中更改列类型?

如何在Spark SQL的DataFrame中更改列类型?
EN

Stack Overflow用户
提问于 2015-04-01 12:55:02
回答 18查看 505K关注 0票数 171

假设我正在做这样的事情:

代码语言:javascript
复制
val df = sqlContext.load("com.databricks.spark.csv", Map("path" -> "cars.csv", "header" -> "true"))
df.printSchema()

root
 |-- year: string (nullable = true)
 |-- make: string (nullable = true)
 |-- model: string (nullable = true)
 |-- comment: string (nullable = true)
 |-- blank: string (nullable = true)

df.show()
year make  model comment              blank
2012 Tesla S     No comment
1997 Ford  E350  Go get one now th...

但我真的希望将year作为Int (或许还可以转换一些其他列)。

我能想到的最好的办法就是

代码语言:javascript
复制
df.withColumn("year2", 'year.cast("Int")).select('year2 as 'year, 'make, 'model, 'comment, 'blank)
org.apache.spark.sql.DataFrame = [year: int, make: string, model: string, comment: string, blank: string]

这有点复杂。

我是从R来的,我习惯了能写作。

代码语言:javascript
复制
df2 <- df %>%
   mutate(year = year %>% as.integer,
          make = make %>% toupper)

我可能遗漏了一些东西,因为在Spark/Scala中应该有更好的方法来做到这一点……

EN

回答 18

Stack Overflow用户

发布于 2015-10-30 04:27:50

编辑:最新版本

从spark 2.x开始,你可以使用.withColumn。请在此处查看文档:

https://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.Dataset@withColumn(colName:String,col:org.apache.spark.sql.Column):org.apache.spark.sql.DataFrame

最早的答案

从Spark版本1.4开始,您可以在列上应用带有DataType的cast方法:

代码语言:javascript
复制
import org.apache.spark.sql.types.IntegerType
val df2 = df.withColumn("yearTmp", df.year.cast(IntegerType))
    .drop("year")
    .withColumnRenamed("yearTmp", "year")

如果使用sql表达式,还可以执行以下操作:

代码语言:javascript
复制
val df2 = df.selectExpr("cast(year as int) year", 
                        "make", 
                        "model", 
                        "comment", 
                        "blank")

有关更多信息,请查看文档:http://spark.apache.org/docs/1.6.0/api/scala/#org.apache.spark.sql.DataFrame

票数 153
EN

Stack Overflow用户

发布于 2015-08-15 03:24:46

您可以使用selectExpr使其更简洁一些:

代码语言:javascript
复制
df.selectExpr("cast(year as int) as year", "upper(make) as make",
    "model", "comment", "blank")
票数 19
EN

Stack Overflow用户

发布于 2016-05-20 06:42:05

用于将DataFrame的数据类型从字符串修改为整数的Java代码

代码语言:javascript
复制
df.withColumn("col_name", df.col("col_name").cast(DataTypes.IntegerType))

它将简单地将现有的(字符串数据类型)转换为Integer。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29383107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档