首页 > 解决方案 > 将 RDD 转换为数据帧在字符串到日期转换时失败

问题描述

我正在从 xml 中提取一些数据。我的整体工作流程可能效率低下,是:

  1. 将 xml 读入数据框('df_individual')
  2. 过滤不需要的列
  3. 制作目标架构(在下面共享)
  4. 将数据帧转换为 RDD
  5. 使用第 3 步和第 4 步中的模式和 RDD 创建数据框

我创建了如下RDD:

rddd = df_individual.rdd.map(tuple)

'df_individual' 是读取 xml 的原始数据帧。

下面是架构:

schema = types.StructType([
        types.StructField('applicaion_id', types.StringType()),
        types.StructField('cd_type', types.StringType()),
        types.StructField('cd_title', types.StringType()),
        types.StructField('firstname', types.StringType()),
        types.StructField('middlename', types.StringType()),
        types.StructField('nm_surname', types.StringType()),
        types.StructField('dt_dob', types.DateType()),
        types.StructField('cd_gender', types.StringType()),
        types.StructField('cd_citizenship', types.StringType())
    ])

它失败了

df_result = spark.createDataFrame(rddd, schema)

错误是

TypeError: field dt_dob: DateType can not accept object '1973-02-19' in type <class 'str'>

创建“df_result”数据框的主要目的是拥有一个预定义的模式并隐式地转换 RDD 和数据框之间存在差异的所有列。这是我第一次使用 RDD,我找不到针对这种情况的直接转换机制。

如果您可以帮助解决铸造错误或分享更好的工作流程,那就太好了。

谢谢

标签: pythondataframeapache-sparkcasting

解决方案


如果您的目标只是将您的数据放入正确的模式并将一些字符串列转换为日期列,我会使用select结合to_date

df.select('applicaion_id', 'cd_type', 'cd_title', 'firstname', 'middlename', 'nm_surname', \
          F.to_date('dt_dob').alias('dt_bob'), \
          'cd_gender', 'cd_citizenship') \
  .printSchema()

印刷

root
 |-- applicaion_id: string (nullable = true)
 |-- cd_type: string (nullable = true)
 |-- cd_title: string (nullable = true)
 |-- firstname: string (nullable = true)
 |-- middlename: string (nullable = true)
 |-- nm_surname: string (nullable = true)
 |-- dt_bob: date (nullable = true)
 |-- cd_gender: string (nullable = true)
 |-- cd_citizenship: string (nullable = true)

dt_bob具有日期数据类型。


推荐阅读