2017-08-30 27 views
0

后,我得到了需要执行以下任务AWS胶水:Rename_field()relationalize

  1. Relationalize数据
  2. 重命名包含字段名”工作不工作的,这样。它可以作为普通的外观名称导入到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()在关系化之前更改字段名称,它会使子表消失。如果在关系化之后使用ApplyMapping.apply(),它只会删除名称中包含'。'的所有字段。

底线是我不能在相同的工作中进行关联和重命名字段,无论我尝试什么。

我错过了什么,或者这是一个AWS胶水错误?

回答

0

确认rename_field()RenameField.apply()的故障是一个胶水错误。

我到目前为止的解决方法是将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") 
+0

是否有一个链接来追踪这个bug? – rob