Glue 无法转换日期
Glue Fails to Convert Date
从 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
以下正确地将字段转换为正确的格式:
sf = sf.withColumn(mapping[0], F.date_format(F.unix_timestamp(mapping[0], "yyyy/MM/dd").cast("timestamp"), "yyyy-MM-dd"))
从 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
以下正确地将字段转换为正确的格式:
sf = sf.withColumn(mapping[0], F.date_format(F.unix_timestamp(mapping[0], "yyyy/MM/dd").cast("timestamp"), "yyyy-MM-dd"))