我有一个Python中的Glue任务,它将单个的parquet文件写入S3中的Delta Lake。
import sys
from awsglue.context import GlueContext
from awsglue.job import Job
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
raw_parquet_path = "s3://my-bucket/data/raw-parquet/motor/"
delta_table_path = (
"s3://my-bucket/data/delta-tables/my_table/"
)
partition_list = ["_event_id"]
args = getResolvedOptions(sys.argv, ["JOB_NAME"])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args["JOB_NAME"], args)
# Script generated for node S3 bucket
S3bucket_node1 = glueContext.create_dynamic_frame.from_options(
format_options={},
connection_type="s3",
format="parquet",
connection_options={
"paths": [raw_parquet_path],
"recurse": True,
},
transformation_ctx="S3bucket_node1",
)
# Script generated for node sink_to_delta_lake
additional_options = {
"path": delta_table_path,
"write.parquet.compression-codec": "snappy",
"mergeSchema": "true",
}
sink_to_delta_lake_node3_df = S3bucket_node1.toDF()
sink_to_delta_lake_node3_df.write.format("delta").options(
**additional_options
).partitionBy(*partition_list).mode("append").save()
job.commit()
我出错了
An error occurred while calling o111.save. Failed to find data source: delta. Please find packages at
我添加了作业详细信息->高级属性->作业参数
--conf
:spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog
--packages
:io.delta:delta-core_2.12:2.1.0
(Note --conf
基于this在一行)
然而,错误变成了
调用o100.getDynamicFrame时出错。无法找到目录“spark_catalog”的目录插件类:org.apache.spark.sql.delta.catalog.DeltaCatalog
有什么想法吗?谢谢!
1条答案
按热度按时间kpbwa7wx1#
我想我错过了io.delta:delta-core_2.12:2.1.0的JAR文件,我将不得不在S3中上传JAR文件,然后在我添加的作业详细信息->高级属性->库->依赖JAR路径中设置S3路径。
但是,我发现了一种简单的方法,而不是手动提供这个文件。
所有我需要的是在作业细节->高级属性->作业参数,添加
--datalake-format
:delta
现在Glue作业可以成功运行了!
下面是
--datalake-formats
的doc的副本:支持AWS Glue 3.0及更高版本。
指定要使用的数据湖框架。AWS Glue会将您指定的框架所需的XML文件添加到
classpath
中。有关更多信息,请参阅将数据湖框架与AWS Glue ETL作业配合使用。您可以指定以下一个或多个值,用逗号分隔:
hudi
delta
iceberg