Сравните две строки на основе определенных полей и отметьте их, если обнаружены различия - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть таблица, созданная в Афине. Структура таблицы выглядит следующим образом:

id (string)
event_val (string)
eventsource (string)
eventtype (string)
payload (struct<field1:struct<attribute2:struct<tokenRegion:string,tokenType:string,token:string>,attribute15:string,attribute1:string,attribute8:string,updatedAt:string,status:string,internalRevision:int,attribute13:string,attribute12:string,id:int,textLineCount:int,createdAt:string,attribute11:string,supplierNumber:struct<tokenRegion:string,tokenType:string,token:string>,shippingTermsCode:string,attribute10:string,attachmentTextConcat:string,attribute18:string,attribute4:string,fileName:string,textLineSplitCount:int,version:int>,textLines:array<struct<price:int,invoiced:int,attribute5:string,attribute11:string,status:string,id:int,lineVersion:int,suppAuxPartNum:string,total:double,attribute12:string,description:string,uOM:string,updatedAt:string,attribute2:string,texteld2:array<struct<segment2:string,accountAllocationSequence:int,segment3:string,segment4:string,orderLineId:int,segment5:string,attribute11:string,segment6:string,attribute12:string,accountAllocationId:int,segment7:string,segment1:string,fileName:string,accountAllocationAmount:double,version:int,orderHederId:int>>,quantity:double,lineNumber:int,sourcePartNum:string,lineType:string,version:int,fileName:string,needByDate:string,createdAt:string,orderHeaderId:int>>>)

В этой таблице будет две записи для каждого ключа event_val. И поле источника событий будет либо «value_a», либо «value_b». По сути, мы вставляем два события с одинаковым значением event_val из двух разных источников событий.

Мне нужно сравнить каждую такую ​​пару и найти разницу, если она есть. Некоторое поле в полезной нагрузке может присутствовать или отсутствовать.

Кроме того, как мы можем сравнивать payload.textLines?

1 Ответ

0 голосов
/ 03 апреля 2020

Вы можете использовать map_agg с группировкой по event_val

Примечание. Необходимо проверить фактический синтаксис. Но что-то вроде следующего должно сделать.

With
intermediate_table as
(
  select event_val, map_agg(eventsource, payload) as payload_by_eventsource
  from <table_name>
  group by event_val
),
intermediate_table_2 as
(
select event_val, payload_by_eventsource['source_a'] as source_a_payload, payload_by_eventsource['source_b'] as source_b_payload
from intermediate_table
)

select .......
from intermediate_table_2
where....
...