在AWS Glue配置GResearch Spark Extension遇模块缺失问题求解决
解决AWS Glue中导入gresearch spark扩展包的ModuleNotFoundError问题
出现ModuleNotFoundError: No module named 'gresearch'的核心原因是:你只上传了该扩展包的Java Jar文件,但gresearch.spark.diff属于Python模块,需要同时部署对应的Python代码包到Glue可访问的路径。以下是正确的配置步骤:
1. 获取完整依赖包
该扩展包包含Java和Python两部分,需要同时准备:
- Java Jar包:你已有的
uk.co.gresearch.spark_spark-extension_2.12-2.2.0-3.3.jar - Python Wheel包:从Maven仓库下载对应版本的
spark-extension_2.12-2.2.0-3.3-py3-none-any.whl,或从本地.ivy2/cache/uk.co.gresearch.spark/spark-extension_2.12/python目录提取Python模块文件。
2. 上传依赖到S3
将Jar包和Python Wheel包(或Python模块目录)上传到同一个S3路径,例如:s3://your-glue-bucket/dependencies/gresearch/
3. 配置Glue作业
在Glue作业的配置页面中进行以下设置:
- Python路径(Python path):添加S3依赖路径到Python模块搜索路径,格式为
s3://your-glue-bucket/dependencies/gresearch/ - 依赖Jar包(Dependent jars):添加Jar包的完整S3路径,例如
s3://your-glue-bucket/dependencies/gresearch/uk.co.gresearch.spark_spark-extension_2.12-2.2.0-3.3.jar - 注意:删除代码中
spark.jars.packages的配置,Glue作业优先使用界面配置的依赖,直接设置packages可能因网络限制无法拉取依赖。
4. 适配Glue环境的代码示例
Glue推荐使用内置的GlueContext获取SparkSession,避免手动创建时的配置冲突,修改后的代码如下:
from awsglue.context import GlueContext from pyspark.context import SparkContext sc = SparkContext.getOrCreate() glueContext = GlueContext(sc) spark = glueContext.spark_session # 导入gresearch模块 from gresearch.spark.diff import * df1 = spark.createDataFrame([ [1, "ABC", 5000, "US"], [2, "DEF", 4000, "UK"], [3, "GHI", 3000, "JPN"], [4, "JKL", 4500, "CHN"] ], ["id", "name", "sal", "Address"]) df2 = spark.createDataFrame([ [1, "ABC", 5000, "US"], [2, "DEF", 4000, "CAN"], [3, "GHI", 3500, "JPN"], [4, "JKL_M", 4800, "CHN"] ], ["id", "name", "sal", "Address"]) df1.show() df2.show() options = DiffOptions().with_change_column('changes') df1.diff_with_options(df2, options, 'id').show()
5. 验证运行
启动Glue作业后,查看日志确认依赖是否加载成功。如果仍有问题,检查S3路径是否正确、Glue作业的IAM角色是否有读取该S3路径的权限。
内容的提问来源于stack exchange,提问作者Qwaz
相关产品推荐
相关产品推荐

