【问题标题】:Athena Query Results: Are they always strings?Athena 查询结果:它们总是字符串吗?
【发布时间】:2019-02-19 15:13:53
【问题描述】:

我正在使用 CTAS 构建新的“ETL”管道。不幸的是,CTAS 查询经常过于密集,导致 Athena 超时。因此,我使用 CTAS 创建初始表并填充一个小样本。然后,我编写了一个脚本,在 CTAS 无法预先处理的剩余天数中查询生成 CTAS 的同一张表(这是 parquet 格式)。在修复表(以获取新数据)之前,我将这些查询结果的输出写入保存 CTAS 查询结果的同一目录。然而,由于多种原因,这似乎是一个相当笨拙的过程:

1) 使用标准 SQL 语句写出的查询结果最终都是字符串。例如,当我写出 DAU 的数量(这是一个计数并转换为一个 int)时,csv 输出是一个字符串,即包装成 ””。 在 CSV 格式中,是否可以将 Athena“query_results”(不是 CTAS)写成字符串以外的任何内容。这样做的主要问题是它意味着它不能被读回到 CTAS 生成的表中,因为这些列需要一个 bigint。当然,这可以通过 lambda 函数来解决,但对于本应微不足道的事情来说,这似乎是一个很大的开销。

2) 您能否将查询结果(不是来自 CTAS)直接放入 parquet 而不是 CSV?

3) 有什么方法可以防止使用 query_results 生成元数据(不是来自 CTAS)。同样,它可以使用 lambda 函数进行清理,但这只是我需要处理的额外废话。

提前致谢!

【问题讨论】:

    标签: amazon-athena


    【解决方案1】:

    结果的数据类型取决于用于创建它的 SQL 以及您使用它的方式。根据您的问题,我将假设您正在使用 CTAS 创建一个表并且输出为 CSV,然后您将直接查看 CSV 数据。

    CSV 中会包含引号,但这并不意味着不能将整数值读取为整数,等等。 Athena 使用 schema-on-read 方法,只要 serde 可以将值解释为特定类型,该类型就会作为列的类型。

    如果您查询由 CTAS 操作创建的表,您应该返回整数列的整数。

    使用 CTAS,您还可以创建保留类型信息的不同类型的输出,例如 JSON、Avro、Parquet 和 ORC。只需use the format property to select the output type

    我有点困惑你的第三个问题是什么意思。使用普通查询,您会在 S3 上获得两个文件,即数据文件和元数据文件,它们将被写入StartQueryExecution API 调用中给出的输出位置,但使用 CTAS 查询,您将获得不同的输出数据位置(在 SQL 中给出)而不是元数据文件。

    您实际上是在使用 CTAS,还是在谈论常规查询结果文件?


    问题得到澄清后更新:

    1) 遗憾的是,Athena 在许多情况下都无法正确读取它自己的输出。这是他们在发布之前从未考虑过的真正让我感到惊讶的事情。您也许可以设置一个使用正则表达式 serde 的表。

    2) 不,不幸的是,此时常规查询的唯一输出是 CSV。

    3) 不,元数据始终写入与输出相同的前缀。

    我认为您最好的选择是运行多个 CTAS 查询来选择源数据的子集,例如,如果有一个日期列,您可以每月创建一个 CTAS 或其他一些有效的时间范围。 CTAS 查询完成后,您可以将结果文件移动到 S3 上的同一目录中,并创建一个以该目录为位置的最终表。

    【讨论】:

    • 嗨 Theo,我意识到我最初的查询不是很清楚。我正在编辑以尝试增加清晰度。感谢您的任何建议。
    • 由于我上面提到的问题,最明智的流程似乎是。 1)创建一个外部表 2)运行查询 3)获取查询结果(避免问题 3) 4)使用 pandas 清理查询结果(避免问题 1) 5)将清理结果推送到他的表从 1)读取的目录
    • 谢天谢地,由于 Athena 现在可以将其查询结果存储为 parquet 或其他二进制格式,因此该问题现已解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 2012-09-28
    相关资源
    最近更新 更多