【问题标题】:AWS Glue TypeError: unsupported operand type(s) for +: 'DynamicFrame' and 'str'AWS Glue TypeError:+ 的不支持的操作数类型:“DynamicFrame”和“str”
【发布时间】:2018-07-12 21:00:16
【问题描述】:

我正在使用 AWS-Glue 构建 ETL 管道,并且在运行作业时遇到此错误:

“TypeError:+ 的不支持的操作数类型:'DynamicFrame' 和 'str'”

该作业正在处理数据,然后将其写入 PostgreSQL 数据库。

在处理正在运行并且 PSQL 数据库正在更新的意义上,该作业似乎运行良好,但该作业在每次运行时仍然报告此错误。

我有点难过,因为我基本上使用的是库存 AWS 作业脚本的修改版本。

这是我的代码:

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
from awsglue.utils import getResolvedOptions
from awsglue.dynamicframe import DynamicFrame

import pyspark.sql.functions
from pyspark.sql.functions import to_date
from pyspark.sql.functions import input_file_name
from pyspark.sql.functions import current_timestamp

## @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)

# Create a DynamicFrame using the Service ROs table
ros_DyF = glueContext.create_dynamic_frame.from_catalog(database="DB",        
table_name="TB", transformation_ctx = "ros_DyF")

# Do a bunch of processing...code not included...

# Update the tables in postgreSQL
psql_conn_options = {'database' : 'DB', 'dbtable' : 'TB'}
psql_tmp_dir = "TMPDIR"
datasink4 = glueContext.write_dynamic_frame.from_jdbc_conf(
frame = mapped_dyF,
catalog_connection = 'wizelyPSQL',
connection_options = psql_conn_options,
redshift_tmp_dir = psql_tmp_dir,
transformation_ctx = "datasink4")

job.commit()

这是我得到的错误:

Traceback (most recent call last):
File "script_2018-07-09-19-30-30.py", line 168, in <module>
transformation_ctx = "datasink4")
File "/mnt/yarn/usercache/root/appcache/application_1531164400757_0001/container_1531164400757_0001_01_000001/PyGlue.zip/awsglue/dynamicframe.py", line 597, in from_jdbc_conf
File "/mnt/yarn/usercache/root/appcache/application_1531164400757_0001/container_1531164400757_0001_01_000001/PyGlue.zip/awsglue/context.py", line 262, in write_dynamic_frame_from_jdbc_conf
File "/mnt/yarn/usercache/root/appcache/application_1531164400757_0001/container_1531164400757_0001_01_000001/PyGlue.zip/awsglue/context.py", line 278, in     write_from_jdbc_conf
File "/mnt/yarn/usercache/root/appcache/application_1531164400757_0001/container_1531164400757_0001_01_000001/PyGlue.zip/awsglue/data_sink.py", line 32, in write
File "/mnt/yarn/usercache/root/appcache/application_1531164400757_0001/container_1531164400757_0001_01_000001/PyGlue.zip/awsglue/data_sink.py", line 28, in     writeFrame
TypeError: unsupported operand type(s) for +: 'DynamicFrame' and 'str'
End of LogType:stdout

有什么建议吗?

【问题讨论】:

  • 你能分享你的代码吗?
  • @YuriyBondaruk 刚刚用代码更新了原始帖子。太棒了!
  • 代码看起来不错。哪条线生产呢?你有堆栈跟踪吗?
  • @YuriyBondaruk 这是产生错误的glueContext.write_dynamic_frame.from_jdbc_conf 命令。写入似乎工作正常(它正在将数据写入 PSQL 数据库) - 但我想让错误消失,所以我没有每次运行时都会产生错误的工作。我用错误日志更新了原始帖子。
  • 通过使用 pyspark.sql 中的 DataFrameWriter 类,我能够成功执行此作业。我尝试了此处引用的选项的所有变体,但出现相同的错误:docs.aws.amazon.com/glue/latest/dg/… 似乎是我在 AWSGlue 代码中存在一个错误 - 与 AWS 进行通信。

标签: amazon-web-services aws-glue


【解决方案1】:

似乎这是 PyGlue 库中的一个错误。但是我检查了源代码并没有任何可疑之处。这是一行:

28.     return DynamicFrame(self._jsink.pyWriteDynamicFrame(dynamic_frame._jdf, callsite(), info), dynamic_frame.glue_ctx, dynamic_frame.name + "_errors")

如果该行如下所示,将产生您收到的错误(从最后一个参数中删除.name):

28.     return DynamicFrame(self._jsink.pyWriteDynamicFrame(dynamic_frame._jdf, callsite(), info), dynamic_frame.glue_ctx, dynamic_frame + "_errors")

在这种情况下,您的工作将起作用,因为self._jsink.pyWriteDynamicFrame(...) 的评估发生在产生错误的字符串连接之前。

如果您在 dev endpoint 中使用 PySpark 库,请尝试从 aws-glue-jes-prod-us-east-1-assets/etl/python/PyGlue.zip 下载最新版本。否则,如果您在 Glue 控制台 UI 中编写脚本(lib 由 AWS Glue 服务提供),那么您应该联系 AWS 支持。

【讨论】:

  • 感谢领导!我正在使用 Glue 控制台 UI,并且我一直在与 AWS Support 来回讨论这个问题,但这是我将发送给他们的一个很好的线索。再次感谢。
猜你喜欢
  • 2013-02-20
  • 2018-12-06
  • 1970-01-01
  • 2021-01-03
  • 2018-04-22
  • 1970-01-01
  • 2016-04-15
  • 2015-12-11
相关资源
最近更新 更多