将rdd转换为dataframe在字符串到日期转换时失败

qgzx9mmu  于 2021-05-29  发布在  Spark
关注(0)|答案(1)|浏览(468)

我正在从xml中提取一些数据。我的整个工作流程(可能效率低下)是:
将xml读入Dataframe('df\u individual')
筛选不需要的列
生成目标架构(下面共享)
将Dataframe转换为rdd
使用第3步和第4步中的模式和rdd创建Dataframe
我创建了rdd,如下所示:

rddd = df_individual.rdd.map(tuple)

“dfèu individual”是读取xml的原始Dataframe。
模式如下:

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\u result”数据框的主要目的是拥有一个预定义的模式,并隐式地强制转换rdd和数据框之间存在差异的所有列。这是我第一次与rdd合作,我找不到一个直接的铸造机制这样的情况。
如果你能帮助解决铸造错误或共享一个更好的工作流程,这将是伟大的。
谢谢

axzmvihb

axzmvihb1#

如果您的目标只是将数据转换为正确的模式,并将一些字符串列转换为日期列,那么我将使用 select 加上迄今为止。

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 具有日期数据类型的。

相关问题