В настоящее время я занимаюсь разработкой для согласования наших данных. Я заметил, что завершение гармонизации происходит медленно.
Я относительно новичок в разработке NoSQL / MarkLogic и не уверен в лучших практиках, которым следует следовать для плавной и быстрой гармонизации.
Вот некоторые факты:
Загрузка данных:
- Данные, загруженные на этапе подготовки, поступили из системы ERP с использованием реляционной базы данных. Данные извлекаются в CSV и загружаются в MarkLogic.
- Все данные реляционной таблицы извлекаются в файл CSV. Каждая таблица представлена в отдельной сущности.
Пост-гармонизация:
- Для согласования 227826 записей потребовалось около 66 минут
- 1074151 запись заняла около 4 часов 19 минут для завершения согласования
Фрагменты кода согласования:
- Существует множество логических схем расчета даты (пример ниже)
function getScheduleWindowEnd(businessUnit,targetDateString,schEndDateString)
{
var scheduleWindowEnd = new String();
var preferredDate = new Date();
var startDayOfWeek = getBUStartDayOfWeek(businessUnit);
if (fn.empty(targetDateString) || targetDateString == null || targetDateString == "" ||
fn.empty(schEndDateString) || schEndDateString == null || schEndDateString == "")
{
tempScheduleWindowEnd = "";
return "";
}
else
{
targetDateString = fn.replace(targetDateString, "/", "-") ;
schEndDateString = fn.replace(schEndDateString,"/","-");
var targetDate = xs.date(targetDateString);
var schEndDate = xs.date(schEndDateString);
// Get preferred date
if (fn.empty(schEndDate))
{
preferredDate = targetDate;
}
else
{
preferredDate = schEndDate;
}
//get target day of week
var scheduledDayOfWeek = xdmp.weekdayFromDate(preferredDate);
if (scheduledDayOfWeek < startDayOfWeek)
{
scheduleWindowEnd = fn.string(addDays(preferredDate,(startDayOfWeek-scheduledDayOfWeek)));
}
else
{
scheduleWindowEnd = fn.string(addDays(preferredDate,(startDayOfWeek-scheduledDayOfWeek+7)));
}
scheduleWindowEnd = fn.replace(fn.substring(scheduleWindowEnd, 1, 10), "-", "/");
tempScheduleWindowEnd = scheduleWindowEnd;
}
return scheduleWindowEnd
}
- Основная сущность получает некоторые данные элемента от других сущностей (в приведенном ниже примере Table2 является другой сущностью)
<StatusDescription>${fn.normalizeSpace(getUDCDescription("00", "SS", fn.normalizeSpace(hl.elementText(source, "WASRST", true))))}</StatusDescription>
function getUDCDescription(drsy,drrt,drky) {
let udcRecord = cts.search(cts.andQuery([
cts.collectionQuery("ERPSystemSource"),
cts.collectionQuery("Table2"),
cts.elementWordQuery(xs.QName("DRSY"), drsy),
cts.elementWordQuery(xs.QName("DRRT"), drrt),
cts.elementWordQuery(xs.QName("DRKY"), drky)
]))
let docXML = new String();
for (const item of udcRecord) {
docXML += hl.encodeXml(fn.normalizeSpace(hl.elementText(item, "DRDL01", true)))
}
return docXML;
}
- Некоторые согласованные данные соответствуют друг другу (прямая выборка). См. Образец ниже:
<Element1>${hl.elementText(source, "WADOCO", true)}</Element1>
<Element2>${fn.normalizeSpace(hl.elementText(source, "WAMCU", true))}</Element2>
- Существует множество вызовов циклов for (не вложенных), около 20 вызовов. Образец в № 2 выше:
xdmp.elapsedTime
. - person Elijah Bernstein-Cooper   schedule 02.08.2018