Apache Spark AWS Glue可以抓取Delta Lake表数据吗?

2fjabf4q  于 2022-12-04  发布在  Apache
关注(0)|答案(5)|浏览(199)

根据Databricks发布的article,可以将Delta Lake与AWS Glue集成。但是,我不确定是否可以在Databricks平台之外也这样做。有人这样做过吗?还有,是否可以使用Glue爬虫添加Delta Lake相关的元数据?

55ooxyrt

55ooxyrt1#

这是不可能的。虽然您可以在数据库平台之外爬网S3增量文件,但您不会在表中找到数据。
根据doc,其内容如下:
警告
不要在位置上使用AWS Glue Crawler来定义AWS Glue中的表格,Delta Lake维护着对应于表格多个版本的文件,查询Glue爬取的所有文件会生成不正确的结果。

8aqjt8rx

8aqjt8rx2#

最后可以使用AWS Glue Crawler来检测和编目增量表。
这里有一个blog post解释如何做到这一点。

7eumitmz

7eumitmz3#

我目前正在使用一个解决方案,通过Apache Spark(https://docs.delta.io/latest/presto-integration.html#language-python)生成Delta表的清单。
我使用以下方法为每个增量表生成一个清单文件:

deltaTable = DeltaTable.forPath(<path-to-delta-table>)
deltaTable.generate("symlink_format_manifest")

然后使用下面的示例创建表。下面的DDL还在Glue Catalog中创建表;然后您可以使用Glue数据目录访问来自AWS Glue的数据。

CREATE EXTERNAL TABLE mytable ([(col_name1 col_datatype1, ...)])
[PARTITIONED BY (col_name2 col_datatype2, ...)]
ROW FORMAT SERDE 
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION '<path-to-delta-table>/_symlink_format_manifest/'  -- location of 
the generated manifest
ktca8awb

ktca8awb4#

如果你能澄清你说的“用AWS胶水整合三角洲湖”是什么意思,那就更好了。
目前,没有直接的Glue API支持Delta湖,但是,您可以使用Delta湖库编写自定义代码,将输出保存为Delta湖。
要使用Crawler将Delta Lakes的 meta添加到目录中,这里有一个解决方法。该解决方法并不漂亮,有两个主要部分。
1)获取Delta Lake引用文件的清单。您可以参考Delta Lake源代码,或者玩弄_delta_log中的日志,或者使用以下粗暴的方法

import org.apache.spark.sql.functions.input_file_name

spark.read.format("delta")
  .load(<path-to-delta-lake>)
  .select(input_file_name)
  .distinct

2)使用Scala或Python Glue API和清单在Catalog中创建或更新表。

hm2xizp9

hm2xizp95#

AWS Glue Crawler允许我们将增量表事务日志中的元数据更新到Glue元存储。参考-https://docs.aws.amazon.com/glue/latest/dg/crawler-configuration.html#crawler-delta-lake
但也有一些缺点-

  • 它在Glue元存储中创建符号链接表
  • 这种基于符号链接的方法在表有多个版本的情况下效果不佳,因为清单文件将指向最新版本
  • 如果元存储中有不同类型的表,则粘附元数据中没有标识符来标识给定表是否为增量表
  • 任何通过清单文件访问增量表的执行引擎都不会利用事务日志中的其他辅助数据,如列统计信息

相关问题