AWS Glue:Rename_field() 在关系化后不起作用
AWS Glue: Rename_field() does not work after relationalize
我得到了一份需要执行以下任务的工作
- 关联数据
- 重命名包含“.”的字段名称,以便它可以作为正常的字段名称导入到 PostgreSQL 中。
这是代码
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "gluecatalog", table_name = "fcorders", transformation_ctx = "datasource0")
rootTableName = 'orders'
dfc = Relationalize.apply(frame = datasource0, staging_path = "s3://my-bucket/temp/", name = rootTableName, transformation_ctx = "dfc")
dfc.keys()
for df_name in dfc.keys():
m_df = dfc.select(df_name)
print "Writing to Postgre table: ", df_name
if (df_name <> rootTableName):
renamefields4 = m_df.rename_field("SalesDeliveryLines.val.shipped.unitDisplayCode", "shipped_unitDisplayCode")
else:
renamefields4 = RenameField.apply(frame = m_df, old_name = "vehicle.sourceReccordUID", new_name = "vehicle_sourceReccordUID", transformation_ctx = "renamefields4")
renamefields4.printSchema()
printSchema() 显示架构未更改。如果我写入数据库,字段名称仍然包含“.”。
如果我在关系化之前使用 ApplyMapping.apply() 更改字段名称,它会使子项 table 消失。如果我在关系化之后使用 ApplyMapping.apply(),它只会删除名称包含“.”的所有字段。
最重要的是,无论我尝试什么,我都无法在同一作业中关联和重命名字段。
我是不是漏掉了什么或者这是 AWS Glue 错误?
已确认 rename_field()
的故障,RenameField.apply()
是 Glue 错误。
目前我的解决方法是将 DynamicFrame 转换为 DataFrame -> 重命名字段 DataFrame -> 将其转换回 DynamicFrame。
这是代码
new_df = m_df.toDF()
print (type( new_df))
for oldName in new_df.schema.names:
new_df = new_df.withColumnRenamed(oldName, oldName.replace("SalesDeliveryLines.val.","").replace(".","_"))
m_df = m_df.fromDF(new_df, glueContext, "m_df")
您需要在字段名称周围放置反引号:
m_df.rename_field("`SalesDeliveryLines.val.shipped.unitDisplayCode`", "shipped_unitDisplayCode")
上找到更多信息
我得到了一份需要执行以下任务的工作
- 关联数据
- 重命名包含“.”的字段名称,以便它可以作为正常的字段名称导入到 PostgreSQL 中。
这是代码
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "gluecatalog", table_name = "fcorders", transformation_ctx = "datasource0")
rootTableName = 'orders'
dfc = Relationalize.apply(frame = datasource0, staging_path = "s3://my-bucket/temp/", name = rootTableName, transformation_ctx = "dfc")
dfc.keys()
for df_name in dfc.keys():
m_df = dfc.select(df_name)
print "Writing to Postgre table: ", df_name
if (df_name <> rootTableName):
renamefields4 = m_df.rename_field("SalesDeliveryLines.val.shipped.unitDisplayCode", "shipped_unitDisplayCode")
else:
renamefields4 = RenameField.apply(frame = m_df, old_name = "vehicle.sourceReccordUID", new_name = "vehicle_sourceReccordUID", transformation_ctx = "renamefields4")
renamefields4.printSchema()
printSchema() 显示架构未更改。如果我写入数据库,字段名称仍然包含“.”。
如果我在关系化之前使用 ApplyMapping.apply() 更改字段名称,它会使子项 table 消失。如果我在关系化之后使用 ApplyMapping.apply(),它只会删除名称包含“.”的所有字段。
最重要的是,无论我尝试什么,我都无法在同一作业中关联和重命名字段。
我是不是漏掉了什么或者这是 AWS Glue 错误?
已确认 rename_field()
的故障,RenameField.apply()
是 Glue 错误。
目前我的解决方法是将 DynamicFrame 转换为 DataFrame -> 重命名字段 DataFrame -> 将其转换回 DynamicFrame。
这是代码
new_df = m_df.toDF()
print (type( new_df))
for oldName in new_df.schema.names:
new_df = new_df.withColumnRenamed(oldName, oldName.replace("SalesDeliveryLines.val.","").replace(".","_"))
m_df = m_df.fromDF(new_df, glueContext, "m_df")
您需要在字段名称周围放置反引号:
m_df.rename_field("`SalesDeliveryLines.val.shipped.unitDisplayCode`", "shipped_unitDisplayCode")
上找到更多信息