簡體   English   中英

將 RDD 轉換為 dataframe 字符串到日期轉換失敗

[英]converting RDD to dataframe fails on string to date conversion

我正在從 xml 中提取一些數據。 我的整體工作流程可能效率低下,是:

  1. 將 xml 讀入 dataframe ('df_individual')
  2. 過濾不需要的列
  3. 制作目標架構(在下面共享)
  4. 將 dataframe 轉換為 RDD
  5. 使用步驟 3 和 4 中的模式和 RDD 創建 dataframe

我創建了如下RDD:

rddd = df_individual.rdd.map(tuple)

'df_individual' 是原始 dataframe,其中讀取 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”dataframe 的主要目的是具有預定義的模式並隱式轉換 RDD 和 dataframe 之間存在差異的所有列。 這是我第一次使用 RDD,我找不到針對這種情況的直接轉換機制。

如果您可以幫助解決鑄造錯誤或分享更好的工作流程,那就太好了。

謝謝

如果您的目標只是將數據放入正確的模式並將一些字符串列轉換為日期列,我將使用selectto_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具有日期數據類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM