类型错误:'JavaPackage'对象不可调用 - jvm.io.delta.tables.DeltaTable.isDeltaTable

0

【以下的问题经过翻译处理】 你好,

我终于使用EMR无服务器应用程序解决了大部分问题,但根据日志显示,似乎在以下代码行中存在特定问题:

if (DeltaTable.isDeltaTable(spark, targetDeltaTableURI)):

日志中的错误消息如下所示,你可以在日志的顶部看到数据帧已创建,但在检查Delta表是否存在时出现错误。

|135123 |1670038 |13558561-12 |2018-03-19 |36.01 |2023-03-22 16:51:05.35525| |668217 |1361372 |13563506-22 |2018-03-22 |27.19 |2023-03-22 16:51:05.35525| +---------+-----------+------------+-------------------+---------+-------------------------+ only showing top 20 rows

Traceback (most recent call last): File "/tmp/spark-9a694201-d321-475f-9855-7d4ada8da0e5/main.py", line 337, in <module> main() File "/tmp/spark-9a694201-d321-475f-9855-7d4ada8da0e5/main.py", line 135, in main processRawData(spark, s3BucketName, objectName, schema, 'bmi') File "/tmp/spark-9a694201-d321-475f-9855-7d4ada8da0e5/main.py", line 317, in processRawData if (DeltaTable.isDeltaTable(spark, targetDeltaTableURI)): File "/home/hadoop/environment/lib64/python3.7/site-packages/delta/tables.py", line 562, in isDeltaTable return jvm.io.delta.tables.DeltaTable.isDeltaTable(jsparkSession, identifier) TypeError: 'JavaPackage' object is not callable

以下是我的提交命令:

aws emr-serverless start-job-run --profile 000000_SD
--name nw_raw_data1
--application-id $APPLICATION_ID
--execution-role-arn $JOB_ROLE_ARN
--job-driver '{ "sparkSubmit": { "entryPoint": "s3://'${S3_BUCKET}'/scripts/main.py", "sparkSubmitParameters": "--jars s3://'${S3_BUCKET}'/scripts/pyspark_nw.tar.gz --py-files s3://'${S3_BUCKET}'/scripts/variables.ini --conf spark.driver.cores=1 --conf spark.driver.memory=2g --conf spark.executor.cores=4 --conf spark.executor.memory=4g --conf spark.executor.instances=2 --conf spark.archives=s3://'${S3_BUCKET}'/scripts/pyspark_nw.tar.gz#environment --conf spark.emr-serverless.driverEnv.PYSPARK_DRIVER_PYTHON=./environment/bin/python --conf spark.emr-serverless.driverEnv.PYSPARK_PYTHON=./environment/bin/python --conf spark.emr-serverless.executorEnv.PYSPARK_PYTHON=./environment/bin/python" } }'
--configuration-overrides '{ "monitoringConfiguration": { "s3MonitoringConfiguration": { "logUri": "s3://'${S3_BUCKET}'/logs/" } } }'

以下是用于构建虚拟环境的pip软件包:

boto3==1.26.74 botocore==1.29.74 delta-spark fhir.resources==6.5.0 pyspark==3.3.0

谢谢你的帮助。

profile picture
专家
已提问 6 个月前34 查看次数
1 回答
0

【以下的回答经过翻译处理】 你好,我认为最后一步的问题在于获取正确的 --jars 设置。你提供的好像是打好包的 pyspark 环境吧,而这不是实际的 delta-core jar 文件。

根据你运行的 EMR 版本,你有几个办法可以尝试:

对于 EMR 6.9.0,Delta Lake 2.1.0 已包含在 EMR Serverless 镜像中。如果你使用相同的版本,你可以在 sparkSubmitParameters 参数中将 spark.jars=/usr/share/aws/delta/lib/delta-core.jar,/usr/share/aws/delta/lib/delta-storage.jar 作为 --conf 项进行指定。你可能还需要在那里添加其他项(如 spark.sql.extensions),如快速入门<https://docs.delta.io/latest/quick-start.html>中所述。
在 EMR 6.9.0 之前,你必须使用 --packages 标志来指定你的 Java 依赖项,或将 delta-core jar 上传到 S3。你可以在 EMR Serverless 文档<https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/using-delta-lake.html> 中找到更多关于这种方法的详细信息。
如果你使用的 Delta Lake 版本与安装在 EMR Serverless 上的版本不匹配,你也可以使用 --packages 参数或按上述方式上传 delta-core jar。--packages 标志将成为 sparkSubmitParameters 的一部分:--packages io.delta:delta-core_2.12:2.2.0。

希望对你有帮助。

profile picture
专家
已回答 6 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则