【问题标题】:Reading a single csv file from s3 bucket using amazon athena and querying it使用 amazon athena 从 s3 存储桶中读取单个 csv 文件并进行查询
【发布时间】:2019-08-14 15:38:03
【问题描述】:

基本上,我想要使用 Amazon Athena 与 s3 存储桶中的 csv 文件建立 SQL 连接。除了第一行将给出标题名称之外,我也不知道任何信息。有谁知道这个问题的解决方案吗?

【问题讨论】:

  • 能否发布您迄今为止尝试过的任何解决方案?
  • @party-ring 我已经检查了这个家伙 Youtube 视频:youtube.com/watch?v=RcFFOyYEWKc&t=165s 但他只解释了文件必须在一个文件夹中,并且您必须传入创建表格的参数并执行之后进行一些修复查询。我想知道有没有一种简单的方法可以做到这一点,我们最初不知道参数是什么,并且可以直接访问 csv 文件,而不必将其放入文件夹中?

标签: python amazon-web-services amazon-athena


【解决方案1】:

您至少有两种方法可以做到这一点。一种是检查文件的几行以检测数据类型,然后创建CREATE TABLE SQL 语句,如Athena docs 所示。

如果您知道您只获取字符串和数字(​​例如),并且如果您知道所有列都有值,那么以这种方式构建它可能相对容易。但是,如果类型可以更灵活或者列可以为空,那么从头开始构建一个健壮的解决方案可能会很棘手。

因此,第二种选择是使用 AWS Glue 目录到 define a crawler,它完全按照我上面告诉您的方式执行,但自动执行。它还会在 Athena 中创建您需要的元数据,因此您无需编写 CREATE TABLE 语句。

作为奖励,您不仅可以使用来自 Athena 的自动编目数据,还可以使用来自 Redshift 和 EMR 的数据。如果您不断将新文件添加到同一个存储桶(每天、每小时、每周...),您可以让抓取再次通过并重新发现数据,以防架构发生变化。

【讨论】:

  • 感谢您的回答哈维尔!这对我来说很有意义,但我只需要更多说明,我是否正确地说:如果您事先知道元数据并且您将 csv 文件存储在文件夹中,Athena 才能正常工作,因为在我看来,Athena 仅适用在这些条件下
  • 您在两个帐户上都是正确的。 Athena 使用架构已知的数据。您可以使用 AWS Glue 来发现和编目数据,或者手动进行。但最后需要定义表并具有模式。此外,Athena 仅适用于 S3 上的数据。它不需要是 CSV(其他格式,如 parquet 更有效),但无论是哪种格式,数据都需要存储在存储桶中,这是 Amazon S3 用于父文件夹概念的名称
  • 请注意,Athena 会读取 S3 前缀内的所有文件。前缀类似于普通文件系统上的文件夹。例如,如果您有存储桶 mybucket 和前缀 data/csv/,则完整的 S3 位置将为 s3://mybucket/data/csv/。如果您使用该 S3 位置创建了一个表,Athena 将在执行查询时扫描其中的所有对象。这还将包括“子文件夹”中的文件,例如data/csv/one/data/csv/two/Athena docs on table locations
猜你喜欢
  • 1970-01-01
  • 2019-09-05
  • 2020-09-19
  • 2019-03-22
  • 2020-08-24
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
相关资源
最近更新 更多