Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何在AWS athena中使用json数组_Amazon Web Services_Amazon Athena - Fatal编程技术网

Amazon web services 如何在AWS athena中使用json数组

Amazon 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

我是雅典娜的新手,目前正在从s3读取文件,并将其作为表格呈现

下面是s3存储桶中各个文件的外观

sample.json

[
    {
    "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运算符将这些数组项展平到表中。您可能希望将数据声明为
数组
,其中结构中包含名称、年龄和薪水道具。但我认为如果你能避免额外的嵌套层,你会有一个更容易的时间