我正在从xml提取一些数据。我的整体工作流程可能效率低下,是:
我创建了如下的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,并且在这种情况下我找不到直接的转换机制。
如果您可以帮助解决铸造错误或共享更好的工作流程,那就太好了。
谢谢
答案 0 :(得分:0)
如果您的目的只是要将数据放入正确的架构中,并将某些字符串列转换为日期列,则可以将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
列具有日期数据类型。