首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改现有数据帧的架构

更改现有数据帧的架构
EN

Stack Overflow用户
提问于 2018-05-31 21:10:39
回答 2查看 41K关注 0票数 9

我想要更改现有数据帧的模式,同时更改我正在经历的模式error.Is有可能我可以更改数据帧的现有模式。

代码语言:javascript
复制
val customSchema=StructType(
      Array(
        StructField("data_typ", StringType, nullable=false),
        StructField("data_typ", IntegerType, nullable=false),
        StructField("proc_date", IntegerType, nullable=false),
        StructField("cyc_dt", DateType, nullable=false),
        ));

val readDF=
+------------+--------------------+-----------+--------------------+
|DatatypeCode|         Description|monthColNam|     timeStampColNam|
+------------+--------------------+-----------+--------------------+
|       03099|Volumetric/Expand...|     201867|2018-05-31 18:25:...|
|       03307|  Elapsed Day Factor|     201867|2018-05-31 18:25:...|
+------------+--------------------+-----------+--------------------+

val rows= readDF.rdd
val readDF1 = sparkSession.createDataFrame(rows,customSchema)

预期结果

代码语言:javascript
复制
val newdf=
    +------------+--------------------+-----------+--------------------+
    |data_typ_cd |       data_typ_desc|proc_dt    |     cyc_dt         |
    +------------+--------------------+-----------+--------------------+
    |       03099|Volumetric/Expand...|     201867|2018-05-31 18:25:...|
    |       03307|  Elapsed Day Factor|     201867|2018-05-31 18:25:...|
    +------------+--------------------+-----------+--------------------+

任何帮助都将得到应用

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-31 21:29:23

您不能像这样更改模式。传递给createDataFrame的模式对象必须与数据匹配,而不是相反:

用来解析时间戳数据的

这样的

  • 使用cast方法来改变其他类型
票数 9
EN

Stack Overflow用户

发布于 2018-05-31 21:37:07

您可以这样做,将数据类型从一种更改为另一种。

我已经创建了一个与您的类似的数据帧,如下所示:

代码语言:javascript
复制
import sparkSession.sqlContext.implicits._
import org.apache.spark.sql.types._

var df = Seq(("03099","Volumetric/Expand...", "201867", "2018-05-31 18:25:00"),("03307","Elapsed Day Factor", "201867", "2018-05-31 18:25:00"))
  .toDF("DatatypeCode","data_typ", "proc_date", "cyc_dt")

df.printSchema()
df.show()

这为我提供了以下输出:

代码语言:javascript
复制
root
 |-- DatatypeCode: string (nullable = true)
 |-- data_typ: string (nullable = true)
 |-- proc_date: string (nullable = true)
 |-- cyc_dt: string (nullable = true)

+------------+--------------------+---------+-------------------+
|DatatypeCode|            data_typ|proc_date|             cyc_dt|
+------------+--------------------+---------+-------------------+
|       03099|Volumetric/Expand...|   201867|2018-05-31 18:25:00|
|       03307|  Elapsed Day Factor|   201867|2018-05-31 18:25:00|
+------------+--------------------+---------+-------------------+

如果您看到上面的模式,则所有列都是String类型。现在,我希望将列proc_date更改为Integer类型,并将cyc_dt更改为Date类型,我将执行以下操作:

代码语言:javascript
复制
df = df.withColumnRenamed("DatatypeCode", "data_type_code")

df = df.withColumn("proc_date_new", df("proc_date").cast(IntegerType)).drop("proc_date")

df = df.withColumn("cyc_dt_new", df("cyc_dt").cast(DateType)).drop("cyc_dt")

当您检查此数据帧的模式时

代码语言:javascript
复制
df.printSchema()

然后,它使用新的列名给出如下输出:

代码语言:javascript
复制
root
 |-- data_type_code: string (nullable = true)
 |-- data_typ: string (nullable = true)
 |-- proc_date_new: integer (nullable = true)
 |-- cyc_dt_new: date (nullable = true)
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50625165

复制
相关文章

相似问题

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