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

如何使用presto查询位于s3的json文件,json,amazon-web-services,amazon-s3,presto,Json,Amazon Web Services,Amazon S3,Presto,我有一个json文件存储在amazon-s3位置,我想使用presto查询这个json文件。如何实现这一点?除了安装和运行您自己的Presto服务,您还可以尝试其他一些选项: 亚马逊雅典娜是一项全面管理的Presto服务。您可以使用它查询AmazonS3中的大型数据存储,包括压缩和分区数据 Amazon S3 Select允许您对存储在Amazon S3中的单个对象运行查询。对于您的特定用例,这可能更简单。选项1-使用json_提取内置函数的EMR上的Presto 我假设您已经使用EMR启动了P

我有一个json文件存储在amazon-s3位置,我想使用presto查询这个json文件。如何实现这一点?

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

亚马逊雅典娜是一项全面管理的Presto服务。您可以使用它查询AmazonS3中的大型数据存储,包括压缩和分区数据


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

选项1-使用json_提取内置函数的EMR上的Presto

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

最简单的方法是使用Presto默认提供的
json\u 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树对象

因此,您只需在presto中定义一个带有字符串类型字段的表,然后使用
json\u 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文档:

选项2-使用json文件的特定Serde对EMR进行预处理

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

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

您将能够以类似于json_提取的方式(使用虚线表示法)访问json文件的字段,并且在大文件上应该更快、更具扩展性。不幸的是,使用这种方法,您有两个主要问题:

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

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

选项3-雅典娜内置JSON Serde


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

你已经在某处运行了Presto吗?你尝试了什么,你遇到了什么问题?嗨,约翰,谢谢你的回复,你可以考虑JSON文件中JSON格式存储的员工对象数组。这是其他系统的输出,它将每天在s3中转储这个json文件。我想使用presto查询这个json文件。问题如何使presto查询存储在s3中的json文件。我尝试在presto中使用location和external_location选项,但都失败了,因为我使用的是s3的完整url。在我的例子中,如何为presto配置数据存储区存储在s3位置的json文件以选择/查询此json文件。我尝试了location和external_location。感谢您花时间解释:)