如何使用 presto 查询位于 s3 的 json 文件
How to query json file located at s3 using presto
我有一个 json 文件存储在 amazon-s3 位置,我想使用 presto 查询这个 json 文件。我怎样才能做到这一点?
除了安装和 运行 自己的 Presto 服务,您还可以尝试其他一些选项:
Amazon Athena 是一项完全托管的 Presto 服务。您可以使用它来查询 Amazon S3 中的大型数据存储,包括压缩和分区数据。
Amazon 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 管理,因此应该更容易设置所有内容。
我有一个 json 文件存储在 amazon-s3 位置,我想使用 presto 查询这个 json 文件。我怎样才能做到这一点?
除了安装和 运行 自己的 Presto 服务,您还可以尝试其他一些选项:
Amazon Athena 是一项完全托管的 Presto 服务。您可以使用它来查询 Amazon S3 中的大型数据存储,包括压缩和分区数据。
Amazon 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
.
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 管理,因此应该更容易设置所有内容。