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

时间:2018-08-23 08:00:45

标签: amazon-web-services apache-spark aws-glue

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

我想创建一个工作,将一个文件转换为另一个文件,然后更新胶水中的数据目录元数据。这样一来,另一项工作就可以提取新的数据源,并使用胶水/ emr /雅典娜使用它。

现在,我可以进行转换了,没有任何问题,但是对我来说,除了使用搜寻器,控制台或胶水API外,我无法解决如何在胶水中创建表的问题-我宁愿在内部进行操作作业,这样我就可以调用下一个作业,而不必执行搜寻器并等待其完成。

胶水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)

这在胶水中不起作用。虽然我可以在胶水作业内的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')]

这让我认为胶水无法与胶水数据目录配合使用-似乎正在使用默认的配置单元目录,我是否缺少某些东西?

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

spark.sql("select * from my_glue_table")

这将起作用,但我怀疑除非运行爬行器,否则这在胶粘作业中将不起作用,而且我真的看不到需要运行爬行器,因为在EMR中我几乎可以用一行来完成代码。

我在这里想念东西吗?

谢谢。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

您可以在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错误。< / p>

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

答案 2 :(得分:0)