在粘附作业中创建粘附数据目录表



我有一个我认为非常简单的要求。

我想创建一个作业,该作业将一个文件转换为另一个文件,然后在 Glue 中更新数据目录元数据。 这将允许另一个作业选取新的数据源并使用 Glue/EMR/Athena 使用它。

现在,我可以毫无问题地进行转换,但对于我的一生,除了使用爬虫或控制台或胶水 API 之外,我无法弄清楚如何在 Glue 中创建表 - 我更愿意在作业中执行此操作,以便我可以调用下一个作业而不是执行爬网程序并等待它完成。

粘附 API 的问题在于,我还必须转换 Spark 架构才能理解 API 布局。

在 EMR 上的 Spark 中,我可以很容易地创建粘附数据目录表(尽管没有很好的文档记录!

dataframe.write.mode(mode).format("parquet").option("path", parquet_path).saveAsTable(glue_table)
dataframe.write.format("parquet").mode(mode).save(parquet_path)

这在 Glue 中不起作用。 虽然我可以在粘附作业中的 Spark 会话上设置粘附数据目录配置单元元数据存储:

spark = SparkSession.builder 
.appName(args['JOB_NAME']) 
.config("hive.metastore.client.factory.class", "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory") 
.enableHiveSupport() 
.getOrCreate()

但是当我尝试设置数据库时,它说它不存在,当我列出数据库时,我得到以下内容:

Databases=[Database(name=u'default', description=u'Default Hive database', locationUri=u'hdfs://ip-172-31-29-88.ap-southeast-2.compute.internal:8020/user/spark/warehouse')]

这让我认为胶水不适用于 Glue 数据目录 - 它似乎正在使用默认的 Hive 目录,我错过了什么吗?

这是一个问题的原因是,在 EMR 中,我可以做这样的事情:

spark.sql("select * from my_glue_table")

这将起作用,但我怀疑这在 Glue 作业中不起作用,除非我运行爬虫并且我真的认为在 EMR 中不需要运行爬虫,我几乎可以用一行代码来完成。

我在这里错过了什么吗?

提前谢谢。

您可以从数据帧创建临时表并运行 sql 查询:

var dataDf = glueContext.sparkSession.read.format(format).load(path)
// or var dataDf = dynamicFrame.toDF()
dataDf.createOrReplaceTempView("my_glue_table")
val allDataDf = glueContext.sparkSession.sql("select * from my_glue_table")

若要在数据目录中创建表,以下代码可能会有所帮助:

val table = new com.amazonaws.services.glue.catalog.Table(namespace, tblName, schema,
partitions, parameters, location, serdeInfo, hiveCompatible)
glueContext.getCatalogClient.createTable(table)

您可以使用Spark SQL 中的CREATE TABLE语句将表添加到 AWS Glue 目录。

spark.sql("USE database_name")
df.registerTempTable("df")
spark.sql("""
CREATE TABLE table_name
USING CSV
AS SELECT * FROM df
""")

写入 CSV 时,我必须确保设置了 Glue 数据库的 URI 位置,否则我最终会遇到'Can not create a Path from an empty string'错误,即使在查询中设置LOCATION也是如此。

写入 Parquet 时,它通过将LOCATION设置为 Amazon S3 路径来工作。

他们在 2020 年 4 月宣布了一项新功能,使其更容易

https://aws.amazon.com/about-aws/whats-new/2020/04/aws-glue-now-supports-the-ability-to-update-partitions-from-glue-spark-etl-jobs/

最新更新