【问题标题】:AWS Glue - How to configure Crawler to create a table with S3 filenames insideAWS Glue - 如何配置 Crawler 以创建包含 S3 文件名的表
【发布时间】:2019-03-09 03:56:09
【问题描述】:

我需要完成的工作:S3 KEYS 上的全文搜索(不是文件内容)

所以,我的 S3 存储桶有这样的结构:

bucket_name/
  user1@gmail.com/
    folder1/
      notthatimportantfile
      ** any folders or files here

  user2@gmail.com/
    folderN/** any folders or files here
    folderN+1/notimportantfile
    folderX/mysuperimportantfile

在我的 JS 应用程序上,我想放置一个搜索框,如果我在其中输入“重要”这个词,我会返回所有名称中包含该词的文件

我对这些文件的内容不感兴趣。所以我在互联网上搜索了如何做到这一点并没有找到任何东西。

我尝试的最后一件事是使用 Amazon Glue 和 Athena,但是当我创建一个 Crawler 并在 Glue 中运行它时,它会为每个文件创建一个表,而我想要的是为每个第一级文件夹创建一个表与其中的文件。例如,上面的结构将在数据库上创建 2 个表: - user1@gmail.com - user2@gmail.com

在这些表上,它们的行将是 S3 中这些文件夹内的文件:

  TABLE "user1@gmail.com"
     _id    filename                      size
     01234  folder1/notthatimportantfile  1024
     56789  folder1/anotherfile_here.txt  768

有了这些,我可以轻松地使用 AWS Athena 来查询数据:

SELECT * from 'user1@gmail.com' WHERE filename LIKE %important%

那么,有没有办法做到这一点?我疯了吗? 有没有更简单的方法?也许是 AWS CloudSearch?

非程序员注意事项:请不要说“只需转到 AWS 控制台并将您的关键字放在搜索框上”。我厌倦了这些答案

【问题讨论】:

    标签: amazon-s3 amazon-athena aws-glue aws-sdk-js


    【解决方案1】:

    有一种使用 Athena 的方法,但我不推荐它。我已经把它包括在下面了。

    根据您的应用程序,有不同的方法可以做到这一点。如果文件不经常更改并且您不介意返回几个小时前的结果,我建议使用S3 Inventory,它会定期写入存储桶中所有对象的列表。要搜索文件,您可以查找最新的库存清单、找到库存清单并扫描它们(您甚至可以使用 Athena 来查询库存,there is a guide for that in the documentation)。

    如果您需要更新,S3 Inventory 将不起作用,因为它每天最多只能生成一次新列表。

    如果是这种情况,您可以简单地为每次搜索列出存储桶中的所有文件,具体取决于我们讨论的文件数量,它可能非常慢或非常快 - 少于 1000 个文件非常快,但之后您将不得不一次对 1000 个对象进行多个请求分页,或者通过列出所有以 a一个操作,在另一个操作中都以b 开头,依此类推。

    如果您想保持最新并快速响应,最经济高效的解决方案是在您的存储桶中保留一个单独的对象索引。通过侦听S3 Event Notifications 来更新索引。监听创建和删除并相应地更新索引。您可以使用 ElasticSearch、Algolia 或 Postgres 或任何其他具有良好全文功能的服务或数据库作为索引 - 当然,它需要设置的基础架构远不止 S3。


    如果您绝对想用 Athena 来做,它可以做到,但它不是最有效的解决方案,如果您有很多文件并且它们包含大量数据,这最终可能会让您付出代价有点,所以要注意。

    在所有 Athena 表中都有一个名为 $path 的隐藏列,其中包含从中读取行的 S3 对象的完整 URI。它也可以用于过滤。

    如果你创建一个这样的表:

    CREATE EXTERNAL TABLE `listing` (`ignored` string)
    STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' 
    OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
    LOCATION 's3://bucket_name/'
    TBLPROPERTIES ('has_encrypted_data'='false')
    

    它只是一个带有虚拟列的表,它可以命名任何东西,它就在那里,因为不可能创建一个没有列的表。只要确保LOCATION 是正确的。

    要搜索对象,您可以这样做:

    SELECT DISTINCT "$path"
    FROM listing
    WHERE "$path" LIKE '%foo%'
    

    虽然这看起来很简洁并且可以解决您的问题,但这是一种非常低效且昂贵的方法。 Athena 将列出您存储桶中的所有文件,然后读取所有文件,您必须为 S3 操作和扫描的数据付费。即使 Athena 最终只查看 S3 密钥,它也没有任何优化可以阻止它读取所有密钥。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-22
      • 2020-09-26
      • 2020-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多