【发布时间】: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