преобразуйте вложенный json в Athena, чтобы показать в Quicksight

#sql #amazon-athena #amazon-quicksight

Вопрос:

Я написал ниже запрос Athena для отображения/визуализации данных в Quicksight. Это прекрасно работает, пока у меня есть одна запись в таблице. Если вы видите запрос, который я жестко закодировал как индекс 1. Как я могу изменить приведенный ниже запрос, чтобы включить все данные из таблицы. Если удалить индекс 1, то это даст мне ошибку, как

 SYNTAX_ERROR: line 8:19: Expression result.extensions.response is not of type ROW  

Запрос:

 select user_id, assessment_id, created_by,result.extensions.response[1].assessmentid AS AssesmentId, result.extensions.response[1].assessmentname AS AssesmentName, response_json.questionid AS QuestionId, response_json.questionText as Questiontext, transform(response_json.answers,answer-gt; answer.answerId) AS AnswerID, transform(response_json.answers,answer-gt; answer.answerText) AS AnswerText FROM focalbucket CROSS JOIN UNNEST(result.extensions.response[1].responseData) AS t(response_json)  

Выход: введите описание изображения здесь

Таблица Афины DDL:

 CREATE EXTERNAL TABLE `focalbucket`(  `assessment_id` int COMMENT 'from deserializer',   `id` string COMMENT 'from deserializer',   `user_id` string COMMENT 'from deserializer',   `project_id` int COMMENT 'from deserializer',   `created_by` string COMMENT 'from deserializer',   `team_id` int COMMENT 'from deserializer',   `result` structlt;extensions:structlt;response:arraylt;structlt;assessmentid:int,assessmentname:string,assessmentcreateddate:string, responsedata:arraylt;structlt;questionid:int,answers:arraylt;structlt;answerid:int,answertext:stringgt;gt;,  questiontext:string,questiontype:stringgt;gt;,userfullname:stringgt;gt;gt;,  completion:boolean,platform:string,app_version:stringgt; COMMENT 'from deserializer',   `verb` structlt;id:stringgt; COMMENT 'from deserializer',   `actor` structlt;mbox:string,name:stringgt; COMMENT 'from deserializer',   `timestamp` bigint COMMENT 'from deserializer',   `version` string COMMENT 'from deserializer') ROW FORMAT SERDE   'org.openx.data.jsonserde.JsonSerDe'  

Ответ №1:

result.extensions.response это также массив, так что вы тоже можете его отменить. Что — то вроде этого (примечание-не тестировалось, так как не было предоставлено никаких примеров данных):

 select   user_id,   assessment_id,   created_by,  t.response.assessmentid AS AssesmentId,  t.response.assessmentname AS AssesmentName,  response_json.questionid AS QuestionId,  response_json.questionText as Questiontext,  transform(response_json.answers,answer-gt; answer.answerId) AS AnswerID,  transform(response_json.answers,answer-gt; answer.answerText) AS AnswerText FROM focalbucket CROSS JOIN UNNEST(result.extensions.response) AS t(response) CROSS JOIN UNNEST(t.response.responseData) AS tt(response_json)