Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 在粘合作业中创建粘合数据目录表 我有一个很简单的要求。_Amazon Web Services_Apache Spark_Aws Glue - Fatal编程技术网

Amazon web services 在粘合作业中创建粘合数据目录表 我有一个很简单的要求。

Amazon web services 在粘合作业中创建粘合数据目录表 我有一个很简单的要求。,amazon-web-services,apache-spark,aws-glue,Amazon Web Services,Apache Spark,Aws Glue,我想创建一个作业,将一个文件转换为另一个文件,然后更新Glue中的数据目录元数据。这将允许另一个作业拾取新的数据源,并使用Glue/EMR/Athena使用它 现在,我可以毫无问题地完成转换,但就我的一生而言,除了使用爬虫程序、控制台或Glue API之外,我无法解决如何在Glue中创建表——我更愿意在作业中这样做,这样我就可以调用下一个作业,而不是执行爬虫程序并等待它完成 glue API的问题是,我还必须转换Spark模式来理解API布局 在Spark on EMR中,我可以非常轻松地创建g

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

现在,我可以毫无问题地完成转换,但就我的一生而言,除了使用爬虫程序、控制台或Glue API之外,我无法解决如何在Glue中创建表——我更愿意在作业中这样做,这样我就可以调用下一个作业,而不是执行爬虫程序并等待它完成

glue API的问题是,我还必须转换Spark模式来理解API布局

在Spark on EMR中,我可以非常轻松地创建glue数据目录表(尽管没有很好的文档记录!):

这在胶水里不起作用。虽然我可以在Glue作业中的Spark会话上设置Glue data catalog配置单元元数据存储:

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不能与glue数据目录一起工作——它似乎使用了默认的配置单元目录,我是否遗漏了什么

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

spark.sql("select * from my_glue_table")
这会起作用,但我怀疑这在粘合作业中不会起作用,除非我运行爬虫程序,我真的不认为有必要运行爬虫程序,而在EMR中,我几乎可以用一行代码来完成

我是不是遗漏了什么


提前感谢。

您可以从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)

您可以使用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位置已设置,否则我最终会出现
“无法从空字符串创建路径”
错误,即使在查询中设置
位置时也是如此


当写入拼花地板时,它通过将
位置设置为Amazon S3路径来工作。

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


非常感谢您的支持。我知道第一个电话-问题是在当前工作之外它不可用。你有第二个电话的详细信息吗。我根本找不到该类的任何引用-例如,什么是serdeInfo对象?HiveCompatible是布尔值吗?有相关文件吗?不幸的是,当你在谷歌上搜索时,你现在得到的只是这个页面。不幸的是,目前没有可用于此方法调用和参数的文档。如果仍然需要的话,我可以试着为你找到一些信息。如果我们能让它工作起来,那就太好了。我们暂时已经解决了这个问题,但是您的解决方案比我们目前正在尝试的要优雅得多。很抱歉,我不能提供所有细节,描述所有依赖类有两个复杂的过程。例如,模式类型
com.amazonaws.services.glue.schema.schema
使用
com.amazonaws.services.glue.schema.types.DataType
和20多个实际类型。您可以使用反射来获取构造函数参数和/或静态创建方法。
spark.sql("USE database_name")

df.registerTempTable("df")

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