aws-glue - 胶水无法转换日期
问题描述
从 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"))
推荐阅读
- c++ - 为什么使用我的类在 c++ 上出现此错误?
- r - 在 R 中的多个其他因子变量上创建平衡的因子向量
- r - R可以触发/播放mp3声音文件吗?
- python - AttributeError:“网站”对象在 odoo 13 中没有属性“get_active_website_setting”
- javascript - 使用 moment.js 解析和显示 Laravel updated_at 时间戳
- javascript - 给 textarea 的分词不会被添加到通过 react-to-pdf 包生成的 pdf 中
- node.js - 无法打开赛普拉斯
- c# - C# OxyPlot:如何在图表上显示点值?
- react-native - 在 React Native 中使用 Expo 的一个信号推送通知
- python - 基本上只使用带有单个整数值的括号从数组列表中删除重复项