1

Я пытаюсь отправить записи вызовов API на S3, а затем только конкретные поля для красного смещения. Например, моя программа посылает следующий JSON в S3 успешно:Kinesis to Redshift COPY Команда с использованием JSONPaths Ошибка файла

{

"user": "user_name", 
"type": "GET", 
"date": "2016-03-22 16:14:13", 
"data": [{ 
    "EmpID": 1, 
    "LastName": "Smith", 
    "FirstName": "Bob", 
    "DOB": "1910-01-01", 
    "SSN": "123456789", 
    "HireDate": "1910-01-01", 
    "City": "Town", 
    "Address": "123 Abc" 
}] 

}

поле «данные» могут содержать одну запись как пример выше или много записей, если запрос возвращает несколько результатов. Я хочу скопировать только данные из данных в таблицу «Сотрудник» на красном смещении с теми же именами столбцов. Копировать с помощью json 'auto' не работает, потому что он анализирует только поля верхнего уровня. В попытке решить эту проблему, я создал следующий JSON трактов файл:

{

"jsonpaths": [ 
    "$.data[0].EmpID", 
    "$.data[0].LastName", 
    "$.data[0].FirstName", 
    "$.data[0].DOB", 
    "$.data[0].SSN", 
    "$.data[0].HireDate", 
    "$.data[0].City", 
    "$.data[0].Address", 
] 

}

Ниже приведен пример запуска моей программы:

  1. Глажу AWS Веб-проект Java на сервере Tomcat
  2. Введите http://localhost:000/projectname/rest/employee/1 (который успешно возвращает объект json для идентификатора сотрудника 1 из моего MS SQL se RVer база данных)
  3. Создает объект JSON в верхней части этого поста с метаданными о вызове и результат запроса
  4. Пишет этот объект успешно «s3: // ковшом/префикс /»
  5. пытается запустите команду копирования и выполните сбой. Когда я перехожу на вкладку загрузки моего красшеского кластера для получения дополнительной информации о том, почему загрузка не удалась, статус команды завершен, и в поле SQL указано «Сотрудник КОПИРОВАНИЯ ANALYZE»
  6. Когда я пытаюсь запустить ручную версию команда копирования ниже, я получаю следующее сообщение об ошибке: «ошибка: XX000: файл манифеста не в правильном формате JSON»

    COPY employee 
    FROM 's3://bucket/prefix/filename' 
    CREDENTIALS 'aws_access_key_id=<>;aws_secret_access_key=<>' 
    JSON 's3://bucket/jsonpaths.json'; 
    

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

{ 

    "entries": [ 
    {"url":"s3://bucket/prefix/file", "mandatory":true} 
    ] 

} 

затем выполняет команду копирования:

COPY employee 
    FROM 's3://bucket/manifest.json' 
    CREDENTIALS'aws_access_key_id=<>;aws_secret_access_key=<>' 
    MANIFEST 

Это дает stl_load_error: «Разделитель не найден» с сырым значением поля как файл в формате JSON, сохраненные на s3. Если я добавлю строку jsonPaths из предыдущей команды копирования, я получаю ту же ошибку манифеста, что и раньше.

Вопросы:

-Есть файл мои JSONPaths в правильном формате?

-Это лучший способ извлечь из нижних уровней JSONArray?

- Правильный ли формат файла манифеста? Зачем нужен файл манифеста?

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

Благодарим за помощь!

ответ

2

Из того, что я помню, когда вы пытаетесь загрузить данные JSON, а файл JSONPaths имеет синтаксическую ошибку, Redshift выдает исключение (неправильное и вводящее в заблуждение), что ваш файл манифеста плохо сформирован. Таким образом, я уверен, что следующая команда будет работать, если нет синтаксических ошибок в файле JSONPaths:

COPY employee 
FROM 's3://bucket/prefix/filename' 
CREDENTIALS 'aws_access_key_id=<>;aws_secret_access_key=<>' 
JSON 's3://bucket/jsonpaths.json'; 

Теперь, что случилось с вашим файлом JSONPaths? Для меня это выглядит хорошо, но я могу предложить несколько вещей, которые вы должны попробовать:

  • Удалить запятой в последней записи, то есть изменить "$.data[0].Address", к "$.data[0].Address".
  • Если вышеуказанное не работает, попробуйте без использования точечной нотации. Например, измените "$.data[0].EmpID" на "$['data'][0]['EmpID']".

P.S.- Это совершенно неправильно:

COPY employee 
FROM 's3://bucket/manifest.json' 
CREDENTIALS'aws_access_key_id=<>;aws_secret_access_key=<>' 
MANIFEST 

Это потому, что вы говорите RedShift использовать файл манифеста, но не то, что входные данные в формате JSON или какой JSONPaths использовать. Таким образом, по умолчанию

the COPY command expects the source data to be in character-delimited UTF-8 text files. The default delimiter is a pipe character (|).

+0

Большое спасибо! Не могу поверить, что я пропустил это. Команда автоматической копии, выпущенная с Kinesis, по-прежнему не работает, но команда ручного копирования работает как минимум. – awsQuestion

+0

Какую часть вы пропустили? Последняя запятая или изменение обозначений на нотацию массива (против точечной нотации)? – TheProletariat

+0

@ketan vijayvargiya, как бы вы справились с этим для всех объектов, используя обозначение скобки? –

Смежные вопросы