如何使用presto查询位于s3的json文件
我有一个json文件存储在amazon-s3位置,我想使用presto查询这个json文件。如何实现这一点?除了安装和运行您自己的Presto服务,您还可以尝试其他一些选项: 亚马逊雅典娜是一项全面管理的Presto服务。您可以使用它查询AmazonS3中的大型数据存储,包括压缩和分区数据如何使用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
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。感谢您花时间解释:)