我有一个非常复杂的嵌套JSON日志。我想基于这些日志创建一个Athena外部表,但仅使用表中的JSON字段中的某些。
我有两个问题:
一个简化的JSON事件示例:
{
"name": "n1",
"f1": "v1",
"group1": {
"g1F1": "v1",
"g1F2": "v2",
"group11": {
"g11F1": "v1",
"g11F2": "v2"
},
"group12": {
"g12F1": "v1",
"g12F2": "v2"
}
},
"group2": {
"g2F1": "v1",
"g2F2": "v2",
...
},
...
}
可以说我只对顶级字段“名称”,“ f1”和一些嵌套字段感兴趣,例如“ group2”的字段“ g2F1”和“ g2F2”。 我可以做这样的事情吗?
CREATE EXTERNAL TABLE mytable (
name string,
f1 string,
group2 struct<g2F1: string, g2F2: string>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://<mybucket>'
?
当我尝试这种方法时-DDL运行没有错误,表已创建,但是'select * from mytable'不会返回结果...
谢谢!
更新:
问题/问题1的解决方案: 不知道为什么,但是一旦我将gzip压缩的日志重新上传到S3中,表创建和查询就开始工作了!
第2个问题-请参见下面的Tanveer的答案。
更新2:
对于那些也在考虑此选项的人:我用大约6G的压缩数据创建了Athena表-一切都很好。但是,查询执行时间非常长。一个简单的查询,在几个字段上使用过滤器,大约需要25-30分钟。...考虑到这只是一个使用6G的POC,而我实际需要几百个Ts-此选项对我来说不可行用例。当然,我没有使用Parquet格式-但由于我经常需要使用大多数列,因此我认为使用Parquet不会大大提高我的查询性能。
答案 0 :(得分:1)
下面的答案。
您的查询未返回数据的原因,因为Athena不喜欢json数据中的换行符。您的表定义是完美的,您无需在整个数据上创建表定义。这就是读取架构的好处。您的整个数据应与以下相同。然后您的Athena查询将返回数据。不要灰心。由于Glue ETL在后台运行Spark,因此Glue ETL可以读取带换行符的json文件。因此,您可以使用Glue ETL将json文件转换为实木复合地板,然后在实木复合地板数据之上创建Athena表。
{“ name”:“ n1”,“ f1”:“ v1”,“ group1”:{“ g1F1”:“ v1”,“ g1F2”:“ v2”,“ group11”:{“ g11F1”: “ v1”,“ g11F2”:“ v2”},“ group12”:{“ g12F1”:“ v1”,“ g12F2”:“ v2”}},“ group2”:{“ g2F1”:“ v1”,“ g2F2“:” v2“}}
将数据转换为拼合形式后,您将仅为查询中使用的列付费,而不是为here所述的整个表付费。