У меня есть запись JSON, в которой есть 2 массива в структуре объекта. Первый массив содержит вопросы, а второй - ответы на эти вопросы. Поэтому мне нужно сопоставить ответы на вопросы, возможно, использую указатель. И мы используем Redshift Spectrum. Я создал таблицу спектра, но когда я извлекаю из обоих массивов, она производит декартово произведение со всеми вопросами и ответами. Ниже в моем JSON.
{
"responseId":"R_Y5HJGhSSD5CdLHz",
"values":{
"startDate":"2019-06-05T17:54:05Z",
"_recordId":"R_Y5HJGhSSD5CdLHz"
},
"displayedValues":{
"QID123647221": [Q1, Q2, Q3],
"QID123647221_NPS_GROUP":[A1, A2, A3]
}
}
Ожидаемый результат:
ResponseID Start Date Question Answer
R_Y5HJGhSSD5CdLHz 6/5/19 Q1 A1
R_Y5HJGhSSD5CdLHz 6/5/19 Q2 A2
R_Y5HJGhSSD5CdLHz 6/5/19 Q3 A3
Но он также дает нежелательные / неправильные совпадения, как показано ниже.
ResponseID Start Date Question Answer
R_Y5HJGhSSD5CdLHz 6/5/19 Q1 A2
R_Y5HJGhSSD5CdLHz 6/5/19 Q1 A3
R_Y5HJGhSSD5CdLHz 6/5/19 Q2 A1
R_Y5HJGhSSD5CdLHz 6/5/19 Q2 A3
R_Y5HJGhSSD5CdLHz 6/5/19 Q3 A1
R_Y5HJGhSSD5CdLHz 6/5/19 Q3 A2
Любой способ устранить неправильные совпадения? Цените любую помощь в этом.
Создание таблицы Spectrum, если кто-то заинтересован в:
create external table schema_ext.md_pulse
(
responseId varchar(256),
"values" struct<
startDate:timestamp,
_recordId:varchar(64)
>,
displayedValues struct<
QID123647221:array<varchar(200)>,
QID123647221_NPS_GROUP:array<varchar(200)>
>
)
row format serde 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
'ignore.malformed.json' = 'true',
'paths'='messageId,traits')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
location 's3://di-production-data-lake/qualtrics/md_pulse/';