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

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

Support Spark SQL 作业的 AWS Glue 数据目录

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

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

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

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

要从 AWS Glue 数据目录中定义的表中的数据,Spark SQL 需要蜂巢 SerDe类,其中在 Spark 作业的类路径中的 AWS Glue 数据目录中定义的格式。

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

将 JSON SerDe 作为额外的 JAR 添加到开发终端节点。对于作业,您可以使用参数字段中的 --extra-jars 参数添加 SerDe。有关更多信息,请参阅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

若要仅查看不同的organization_ids,从memberships表中,运行以下 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 语句或移植现有应用程序的简洁方法。