首页 文章

在胶水作业中创建胶水数据目录表

提问于
浏览
2

我认为这是一个非常简单的要求 .

我想创建一个作业,它接受一个文件并将其转换为另一个文件,然后在胶水中更新数据目录元数据 . 这将允许另一个作业然后获取新数据源并使用glue / emr / athena消耗它 .

现在,我可以毫无问题地进行转换,但对于我的生活,除了使用爬虫或控制台或胶水API之外,我无法弄清楚如何在胶水中创建表格 - 我更喜欢在工作中这样做我可以调用下一个作业而不是执行爬虫并等待它完成 .

胶水API的问题是我还必须转换spark模式以理解API布局 .

在Spark on EMR中,我可以非常轻松地创建胶水数据目录表(尽管没有详细记录!):

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

这在胶水中不起作用 . 虽然我可以在胶水作业中的spark会话中设置胶水数据目录hive元数据存储:

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')]

这让我觉得胶水不能与胶水数据目录一起使用 - 它似乎是使用默认的蜂巢目录,我错过了什么?

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

spark.sql("select * from my_glue_table")

哪个会起作用,但我怀疑这不会在胶水作业中起作用,除非我运行一个爬虫并且我真的没有看到在EMR中运行爬虫的需要我可以用一行代码来完成它 .

我在这里错过了什么吗?

提前致谢 .

1 回答

  • 2

    您可以从DataFrame创建临时表并运行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)
    

相关问题