如何使用 presto 查询位于 s3 的 json 文件

How to query json file located at s3 using presto

我有一个 json 文件存储在 amazon-s3 位置,我想使用 presto 查询这个 json 文件。我怎样才能做到这一点?

除了安装和 运行 自己的 Presto 服务,您还可以尝试其他一些选项:

A​​mazon Athena 是一项完全托管的 Presto 服务。您可以使用它来查询 Amazon S3 中的大型数据存储,包括压缩和分区数据。

A​​mazon S3 Select 允许您运行 查询存储在 Amazon S3 中的单个对象。对于您的特定用例,这可能更简单。

选项 1 - EMR 上的 Presto 具有 json_extract 内置函数

我假设您已经使用 EMR 启动了 Presto。

最简单的方法是使用 Presto 默认附带的 json_extract 函数。

所以假设您在 s3 上有一个 json 文件,如下所示:

{"a": "a_value1", "b": { "bb": "bb_value1" }, "c": "c_value1"}
{"a": "a_value2", "b": { "bb": "bb_value2" }, "c": "c_value2"}
{"a": "a_value3", "b": { "bb": "bb_value3" }, "c": "c_value3"}
...
...

每一行代表一个 json 树对象。

所以你可以简单地用一个字符串类型的字段快速定义一个table,然后用json_extract.

轻松查询table
SELECT json_extract(json_field, '$.b.bb') as extract
FROM my_table

结果会是这样的:

| extract         |
|-----------------|
| bb_value1       |
| bb_value2       |
| bb_value3       |

这是使用 presto 读取 json 文件的一种快速简便的方法,但不幸的是,这在大 json 文件上的扩展性不佳。

json_extract 上的一些快速文档:https://prestodb.github.io/docs/current/functions/json.html#json_extract

选项 2 - EMR 上的 Presto 具有针对 json 文件的特定 Serde

您还可以在 emr 集群的 bootstrap 阶段自定义您的 presto,方法是添加自定义插件或 SerDe 库。

因此您只需选择一个可用的 JSON SerDe 库(例如 org.openx.data.jsonserde.JsonSerDe)并按照他们的指南定义与 Json 文件。

您将能够以与 json_extract 类似的方式(使用点分符号)访问 json 文件的字段,并且它应该更快并且在大数据上可以很好地扩展文件。不幸的是,使用这种方法有两个主要问题:

1) 为复杂的文件定义一个table就像在地狱里一样。

2) 您可能有内部 java 转换异常,因为 SerDe 库无法轻松转换 json 中的数据。

选项 3 - Athena 内置 JSON Serde

https://docs.aws.amazon.com/athena/latest/ug/json.html

您似乎有一些 Json SerDe 也内置了 Athena,我个人从未尝试过这些,但它们由 AWS 管理,因此应该更容易设置所有内容。