Amazon web services 如何在AWS athena中使用json数组
我是雅典娜的新手,目前正在从s3读取文件,并将其作为表格呈现 下面是s3存储桶中各个文件的外观 sample.jsonAmazon web services 如何在AWS athena中使用json数组,amazon-web-services,amazon-athena,Amazon Web Services,Amazon Athena,我是雅典娜的新手,目前正在从s3读取文件,并将其作为表格呈现 下面是s3存储桶中各个文件的外观 sample.json [ { "name":"John", "age":29, "salary":300 }, { "name":"Mary", "age":25, "salary
[
{
"name":"John",
"age":29,
"salary":300
},
{
"name":"Mary",
"age":25,
"salary":500
}
]
我试着用这些数据创建一个表,但我无法得到所需的格式。我想让每本字典占一行。该表应该有三列(姓名、年龄、薪水)
在下面尝试过,但它将整个内容按原样放在数据列下
CREATE EXTERNAL TABLE IF NOT EXISTS test(
`data` string
)
LOCATION 's3://somelocation/'
TBLPROPERTIES ('has_encrypted_data'='false');
输出
data
-----
[{"name":"John",...},{{"name":"Mary",...}]
参考了,但没有到达任何地方
有没有一个理想的方法可以做到这一点?仅供参考,每个文件中存在的dict数量可能会有所不同,并且根本不是固定的。因此,我正在寻找一种动态解决方案,如果s3中只有一个dict,并且每个文件中都有10个dict,那么这种解决方案将非常有效。您有两种选择:
- 使用AWS Glue并使用JSON路径作为
$[*]
- 将记录保持为long varchar(string),并使用查询动态解析它。例如,要获取第一条记录的名称:
SELECT json_array_get('[
{
"name":"John",
"age":29,
"salary":300
},
{
"name":"Mary",
"age":25,
"salary":500
}
]',-1);
您有两个选择:
- 使用AWS Glue并使用JSON路径作为
$[*]
- 将记录保持为long varchar(string),并使用查询动态解析它。例如,要获取第一条记录的名称:
SELECT json_array_get('[
{
"name":"John",
"age":29,
"salary":300
},
{
"name":"Mary",
"age":25,
"salary":500
}
]',-1);
如果基于Json SerDe创建一个Athena表,并且希望单个s3对象包含多个行/记录,那么期望的结果是每一行/记录都位于文件中自己的行上,并且没有外部Json数组包装所有记录 如果希望表中有三列分别为姓名、年龄和薪水,则需要在表DDL中声明这些列。如果您像上面描述的那样重新构造文件,Json SerDe将相应地找到Json道具
如果您无法轻松地重新构造文件,使每行都有一条记录,那么您可能需要研究对当前调用的列
data
使用配置单元数组类型,然后使用Presto的UNNEST运算符将这些数组项展平到表中。您可能希望将数据声明为数组
,其中结构中包含名称、年龄和薪水道具。但是我认为如果你能避免额外的嵌套层,你会有一个更容易的时间。如果你基于Json SerDe创建一个Athena表,并且你希望一个s3对象包含多个行/记录,那么期望每一行/记录都在文件中自己的行上,并且没有外部JSON数组包装所有记录
如果希望表中有三列分别为姓名、年龄和薪水,则需要在表DDL中声明这些列。如果您像上面描述的那样重新构造文件,Json SerDe将相应地找到Json道具
如果您无法轻松地重新构造文件,使每行都有一条记录,那么您可能需要研究对当前调用的列data
使用配置单元数组类型,然后使用Presto的UNNEST运算符将这些数组项展平到表中。您可能希望将数据声明为数组
,其中结构中包含名称、年龄和薪水道具。但我认为如果你能避免额外的嵌套层,你会有一个更容易的时间