Ошибка вложенного JSON в AWS Athena

У меня есть вложенный файл JSON, который выглядит следующим образом:

\n  \"total\" : 510,\n  \"start\" : 0,\n  \"count\" : 500,\n  \"data\" : [ {\n    \"id\" : 294,\n    \"candidate\" : {\n      \"id\" : 5275,\n      \"firstName\" : \"bob\",\n      \"lastName\" : \"bob\"\n    },\n    \"sendingUser\" : {\n      \"id\" : 5,\n      \"firstName\" : \"tom\",\n      \"lastName\" : \"tom\"\n    },\n    \"dateAdded\" : 1487865908960,\n    \"jobOrder\" : {\n      \"id\" : 71,\n      \"title\" : \"Job\"\n    },\n    \"status\" : \"1st Interview\",\n    \"_score\" : 1.0\n  }

У меня это хранится в S3, и я пытаюсь создать таблицу в AWS Athena, редактор, который я сделал, находится ниже:

CREATE EXTERNAL TABLE IF NOT EXISTS cvtest (
  data struct < candidate struct <id string, firstName string, lastName string>,
                sendingUser struct <id string, firstName string, lastName string>,
                dateAdded string,
                jobOrder string,
                score string
              > 
  )           
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://es-cvsent'; 

Но запрос выдает ошибку ниже;

FAILED: ParseException line 2:26 missing : at 'struct' near '<EOF>' line 2:37 missing : at 'string' near '<EOF>' line 2:55 missing : at 'string' near '<EOF>' line 2:72 missing : at 'string' near '<EOF>' line 3:28 missing : at 'struct' near '<EOF>' line 3:39 missing : at 'string' near '<EOF>' line 3:57 missing : at 'string' near '<EOF>' line 3:74 missing : at 'string' near '<EOF>' line 4:26 missing : at 'string' near '<EOF>' line 5:25 missing : at 'string' near '<EOF>' line 6:22 missing : at 'string' near '<EOF>'

This query ran against the "test" database, unless qualified by the query. Please post the error message on our forum or contact customer support with Query Id: 84e876e8-b947-490e-b2b6-7bf9c376266e.

Кто-нибудь может увидеть, что я делаю не так?


person N.EdenSmith    schedule 12.08.2017    source источник
comment
Это недопустимый JSON, а также недопустимый вложенный JSON. Как это дошло до нынешнего состояния? Похоже, что он, возможно, был извлечен из более крупной структуры JSON с использованием строковых манипуляций вместо десериализации с помощью парсера JSON ... и вы просто не можете этого сделать и в итоге получите анализируемый контент. Похоже, что начальный "{ и завершающий }" отсутствуют, что сделало бы его действительной строкой JSON, содержащей объект JSON, но все же не действительным объектом JSON в целом, поэтому решение, вероятно, будет более сложным, чем просто это.   -  person Michael - sqlbot    schedule 12.08.2017
comment
Спасибо, Майкл, эта строка является первым отрывком из имеющегося у меня файла JSON. файл включает еще 500 строк в структуре данных. Но ваша точка зрения имеет смысл. JSON был создан сценарием python, который вызывает REST API и помещает затем использует дамп JSON для дампа файла. Может быть, ответ здесь в форматировании вывода. Как и при просмотре файла, он находится в одной строке, в отличие от традиционного JSON.   -  person N.EdenSmith    schedule 13.08.2017
comment
Если вы получаете файл, который уже содержит JSON, вам нужно либо просто сохранить файл, не используя JSON (опять же, потому что это уже JSON), либо вам нужно декодировать исходный JSON из API, а затем перекодировать это при сохранении. Ваш окончательный файл должен быть чистым, полным объектом JSON и не содержать вложенных файлов JSON. Предложение: напишите небольшой скрипт, чтобы убедиться, что вы можете снова открыть файлы, которые вы создаете, и самостоятельно декодировать JSON. Если не можешь, то и Афина не сможет.   -  person Michael - sqlbot    schedule 13.08.2017
comment
Спасибо, Майкл, я взял двойное кодирование и написал ответ URL прямо в формате JSON в s3. Когда я печатаю, он печатает так, как вы ожидаете JSON. Пример ниже: {id: 467, кандидат: {id: 8077, firstName: Bob, lastName: Bob}, sentUser: {id: 7566, firstName: Bob, lastName: Bob}, dateAdded: 1498550860320, jobOrder: {id: 5 , title: Job}, status: В избранном, _score: 1.0},   -  person N.EdenSmith    schedule 14.08.2017
comment
я могу использовать это в этом формате?   -  person N.EdenSmith    schedule 14.08.2017
comment
Мне это кажется намного лучше. Запятая в конце строки не подходит для отдельного объекта, но, если это часть более крупного документа, это может быть нормально. Посмотрите, работает ли это.   -  person Michael - sqlbot    schedule 14.08.2017
comment
поэтому ошибка не изменилась на FAILED: Execution Error, код возврата 1 из org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.IllegalArgumentException: невозможно создать путь из пустой строки   -  person N.EdenSmith    schedule 16.08.2017
comment
Вышеуказанное исправлено, поскольку я пропустил / в конце местоположения. Теперь у меня есть успешный запрос. но неправильно отформатирован, все отображается в одном поле под данными   -  person N.EdenSmith    schedule 17.08.2017


Ответы (1)


Сами данные не выглядят как действительный JSON, но независимо от этого вы должны иметь возможность создать таблицу, потому что базовые данные не проверены в этот момент времени. (Просто запросить таблицу впоследствии не сработает).

Проблема в том, что ваш синтаксис неверен, см. эта документация.: используется между столбцом и типом данных в определении структуры.

Это должно работать

data struct<candidate:struct<id:string, firstName:string, lastName:string>,
                sendingUser:struct<id:string, firstName:string, lastName:string>,
                dateAdded:string,
                jobOrder:string,
                score:string
              >   
person Philipp Johannis    schedule 13.08.2020