【问题标题】:How to query json file located at s3 using presto如何使用presto查询位于s3的json文件
【发布时间】:2020-01-15 03:01:15
【问题描述】:

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

【问题讨论】:

  • 您是否已经在某个地方运行了 Presto?您尝试过什么,遇到了什么问题?
  • 嗨,John,谢谢您的回复您可以考虑以 json 格式存储在 json 文件中的员工对象数组。这是其他一些系统的输出,它将每天将此 json 文件转储到 s3 中。我想使用 presto 查询这个 json 文件。问题。如何让 presto 查询存储在 s3 中的这个 json 文件。我尝试使用 presto 中可用的 location 和 external_location 选项,但两者都失败了,因为我使用的是 s3 的完整 url。

标签: json amazon-web-services amazon-s3 presto


【解决方案1】:

选项 1 - 在 EMR 上使用 json_extract 内置函数 Presto

我假设您已经使用 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 树对象。

因此,您可以简单地预先定义一个包含一个字符串类型字段的表,然后使用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 上的一些 presto 文档:https://prestodb.github.io/docs/current/functions/json.html#json_extract

选项 2 - 在 EMR 上使用特定 Serde 用于 json 文件的 Presto

您还可以通过添加自定义插件或 SerDe 库,在 emr 集群的引导阶段自定义您的 presto。

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

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

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

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

选项 3 - Athena 内置 JSON Serde

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

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

【讨论】:

  • 感谢您花时间解释它:)
【解决方案2】:

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

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

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

【讨论】:

  • 如何为 presto 配置数据存储,在我的情况下 json 文件存储在 s3 位置以选择/查询此 json 文件。我尝试使用 location 和 external_location。
猜你喜欢
  • 2021-05-25
  • 2023-03-16
  • 2019-11-01
  • 2019-07-03
  • 2013-11-26
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 2021-06-11
相关资源
最近更新 更多