首页 > 解决方案 > 胶水无法转换日期

问题描述

从 Glue DynamicFrame 读取数据并将其写入 RDS Postgresql 实例时,Glue 无法将格式为“yyyy/MM/dd”的日期转换为“yyyy-MM-dd”。该字段在 Glue 目录中被检测为类型字符串,数据库类型为日期。

DynamicFrame 是使用以下方法创建的:

df = glueContext.create_dynamic_frame.from_catalog(database=glue_db, table_name=glue_tbl_name, push_down_predicate=pushdown_predicate, transformation_ctx="df")

它使用以下方法写入数据库:

output = glueContext.write_dynamic_frame.from_jdbc_conf(frame = df, catalog_connection = db_connection, 
        connection_options = {
            "database" : target_db, 
            "dbtable" : staging_table
            })

包含格式为“yyyy/MM/dd”的日期的字段在数据库中为空。设置包含格式为“yyyy-mm-dd”的日期的字段。我通过使用 Athena 查询已编目的 S3 文件验证了源日期不为空。

我试图通过将 DynamicFrame 转换为 Spark 数据框并转换列来将日期重新格式化为“yyyy-MM-dd”,但该列仍设置为空。这是转换代码:

from awsglue.dynamicframe import DynamicFrame
from pyspark.sql import functions as F

def convert_date_fields(map, df, glueContext):
    sf = df.toDF()
    for mapping in map:
        logger.info(f'Check if {mapping[3]} is equal to date.')
        if mapping[3] == "date":
            logger.info(f'Converting {mapping[0]} to yyyy-mm-dd')
            sf = sf.withColumn(mapping[0], F.to_date(mapping[0], 'yyyy-MM-dd'))

    df = DynamicFrame.fromDF(sf, glueContext, "df")
    return df

标签: aws-glueaws-cdk

解决方案


以下正确地将字段转换为正确的格式:

sf = sf.withColumn(mapping[0], F.date_format(F.unix_timestamp(mapping[0], "yyyy/MM/dd").cast("timestamp"), "yyyy-MM-dd"))

推荐阅读