在Amazon Athena上创建地图属性表

时间:2017-07-26 21:28:46

标签: json amazon-web-services amazon-s3 amazon-dynamodb amazon-athena

我正在尝试从源自Amazon DynamoDB的JSON文件中获取所有属性。现在我将文件发送到Amazon S3存储桶并使用Amazon Athena进行读取。这是来自JSON文件的示例

    {
  "Items": [
    {
      "payload": {
        "phase": "T",
        "tms_event": "2017-03-16 18:19:50",
        "id_UM": 0,
        "num_severity_level": 0,
        "event_value": 1,
        "int_status": 0
      },
      "deviceId": 6,
      "tms_event": "2017-03-16 18:19:50"
    }
  ]
}

我希望在不同的字段上获取deviceId,tms_event,phase,id_UM和event_value。这是我的表格,但它没有分隔字段,

CREATE EXTERNAL TABLE IF NOT EXISTS default.iot_table (
  `Items` ARRAY<
    STRUCT<
      `payload`: STRUCT<`phase`: string, `tms_event`: string, `id_UM`: int, `num_severity_level`: int, `event_value`: int, `int_status`: int>,
      `deviceId`: int,
      `tms_event`: string
    >
  >
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = '1'
) LOCATION 's3://iot-logging/'
TBLPROPERTIES ('has_encrypted_data'='false')

由于

1 个答案:

答案 0 :(得分:1)

您描述的问题在于您正在执行的查询中。如果您只是运行app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); ,则结果是组合的JSON。

要将元素选择为单个列,您需要单独选择它们:

public async Task<IActionResult> Profile(int? id)
{
    if (id == null)
    {
        // Get the id
    }

    var profile = await _context.Profile
        .SingleOrDefaultAsync(m => m.Id == id);
    if (profile == null)
    {
        return NotFound();
    }

    return View(profile);
}

由于您的第一个元素是一个数组并且可以包含多个项目,因此需要交叉连接。