AWS Glue 数据目录 支持 Spark SQL 作业 - AWS Glue
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

AWS Glue 数据目录 支持 Spark SQL 作业

AWS Glue 数据目录 是一个与 Apache Hive 元存储兼容的目录。您可以配置 AWS Glue 作业和开发终端节点以使用 数据目录 作为外部 Apache Hive 元存储。随后,您可以直接对存储在 数据目录 中的表运行 Apache Spark SQL 查询。默认情况下,AWS Glue 动态帧与 数据目录 集成。但是,利用此功能,Spark SQL 作业可以开始使用 数据目录 作为外部 Hive 元存储。

您可以通过将 "--enable-glue-datacatalog": "" 参数分别添加到作业参数和开发终端节点参数来配置 AWS Glue 作业和开发终端节点。传递此参数将在 Spark 中设置某些配置,使其能够访问 数据目录 作为外部 Hive 元存储。它还在 作业或开发终端节点中创建的 对象中SparkSession启用 Hive 支持AWS Glue。

要启用 数据目录 访问,请选中 控制台上的 Add job (添加作业)AWS Glue 数据目录 或 Add endpoint (添加终端节点) 页面上的 Catalog options (目录选项) 组中的 Use as the Hive metastore (使用 Hive 元存储) 复选框。请注意,用于作业或开发终端节点的 IAM 角色应具有 glue:CreateDatabase 权限。在 数据目录 中创建一个名为“default”的数据库(如果该数据库不存在)。

让我们看一下如何在 Spark SQL 作业中使用此功能的示例。以下示例假定您已对 s3://awsglue-datasets/examples/us-legislators 中提供的美国议员数据集进行爬网。

要从 AWS Glue 数据目录 中定义的表中序列化/反序列化数据,Spark SQL 需要 Hive SerDe 类,该类针对 Spark 作业的类路径中的 AWS Glue 数据目录 中定义的格式。

SerDes 适用于某些常见格式的 AWS Glue 由 分发。以下是这些格式的 Amazon S3 链接:

将 JSON SerDe 作为额外的 JAR 添加到开发终端节点。对于作业,您可以在参数字段中使用 SerDe 参数添加 --extra-jars。有关更多信息,请参阅由 AWS Glue 使用的特殊参数

以下是用于创建开发终端节点的示例输入 JSON,其中已为 Spark SQL 启用 数据目录。

{ "EndpointName": "Name", "RoleArn": "role_ARN", "PublicKey": "public_key_contents", "NumberOfNodes": 2, "Arguments": { "--enable-glue-datacatalog": "" }, "ExtraJarsS3Path": "s3://crawler-public/json/serde/json-serde.jar" }

现在,使用 Spark SQL 查询从美国议员数据集创建的表。

>>> spark.sql("use legislators") DataFrame[] >>> spark.sql("show tables").show() +-----------+------------------+-----------+ | database| tableName|isTemporary| +-----------+------------------+-----------+ |legislators| areas_json| false| |legislators| countries_json| false| |legislators| events_json| false| |legislators| memberships_json| false| |legislators|organizations_json| false| |legislators| persons_json| false| +-----------+------------------+-----------+ >>> spark.sql("describe memberships_json").show() +--------------------+---------+-----------------+ | col_name|data_type| comment| +--------------------+---------+-----------------+ | area_id| string|from deserializer| | on_behalf_of_id| string|from deserializer| | organization_id| string|from deserializer| | role| string|from deserializer| | person_id| string|from deserializer| |legislative_perio...| string|from deserializer| | start_date| string|from deserializer| | end_date| string|from deserializer| +--------------------+---------+-----------------+

如果该格式的 SerDe 类在作业的类路径中不可用,您将看到类似于以下内容的错误。

>>> spark.sql("describe memberships_json").show() Caused by: MetaException(message:java.lang.ClassNotFoundException Class org.openx.data.jsonserde.JsonSerDe not found) at org.apache.hadoop.hive.metastore.MetaStoreUtils.getDeserializer(MetaStoreUtils.java:399) at org.apache.hadoop.hive.ql.metadata.Table.getDeserializerFromMetaStore(Table.java:276) ... 64 more

要仅从 memberships 表中查看不同的 organization_ids,请执行以下 SQL 查询。

>>> spark.sql("select distinct organization_id from memberships_json").show() +--------------------+ | organization_id| +--------------------+ |d56acebe-8fdc-47b...| |8fa6c3d2-71dc-478...| +--------------------+

如果需要对动态帧执行相同操作,请执行以下操作。

>>> memberships = glueContext.create_dynamic_frame.from_catalog(database="legislators", table_name="memberships_json") >>> memberships.toDF().createOrReplaceTempView("memberships") >>> spark.sql("select distinct organization_id from memberships").show() +--------------------+ | organization_id| +--------------------+ |d56acebe-8fdc-47b...| |8fa6c3d2-71dc-478...| +--------------------+

虽然 DynamicFrames 已针对 ETL 操作进行优化,但允许 Spark SQL 直接访问 数据目录 提供了一种执行复杂的 SQL 语句或移植现有应用程序的简洁方法。