U-SQL Inner Join создает огромный большой файл записи

Все -

У меня есть некоторые проблемы с объединением таблиц ADLA и их загрузкой в ​​Azure SQL DW.

Я застрял на одном из процессов загрузки и не знаю, как решить эту проблему. У меня есть некоторая информация о покупке, которая, когда я извлекаю из локальной системы в ADLS, создает выходной файл размером около 25 МБ каждый, и когда я пытаюсь присоединиться к ним с помощью «INNER JOIN» в задании ADLA, он продолжает работать в течение длительного времени. Во время работы я вижу, что выходной файл продолжает занимать более 5 ГБ. Я чувствую, что это слишком много для файла размером 25 МБ, и не уверен, что делаю что-то не так (снимок экрана прилагается для справки при запуске из VS).

Процесс, который я делаю: 1- загружаю данные из локальной базы данных в облачное хранилище ADLS с помощью ADF 2- запускаю задание ADLA для извлечения файла ADLS в таблицу ADLA и раздел, используя параметр ROUND ROBIN, чтобы избежать проблем с перекосом данных 3- задание ADLA создаст агрегированный файл в хранилище ADLS 4 — конвейер ADF для загрузки файла № 3 в Azure SQL DW

Любые указатели или помощь могут быть очень полезными.

Спасибо, Шабир

Вот код (я удалил все имена полей и информацию о клиенте). Надеюсь это поможет.

DECLARE @dir = "/{date:yyyy}/{date:MM}/{date:dd}/<FILE PATH>/";
DECLARE @in_1 string = <FILE #1>;
DECLARE @in_2 string = <FILE #2>;
DECLARE @out string = <OUTPUT FILE>;

@file1 =
    EXTRACT 
        <25 COL. WITH ALL NULLABLE>
        date DateTime
    FROM @in_1
    USING Extractors.Text(delimiter : '|');

@file2 =
    EXTRACT 
        <40 COL. WITH ALL NULLABLE>
        date DateTime
    FROM @in_2
    USING Extractors.Text(delimiter : '|');

@output =
    SELECT 
        <25 + 40 COL. FROM INPUT FILES>
    FROM @file1 AS f1
        INNER JOIN @file2 AS f2
        ON f1.join1 == f2.join2;

OUTPUT @purchase
TO @out
USING Outputters.Text(delimiter : '|');

Это запускается через конвейер ADF и использует внешние параметры для даты и путей к файлам.

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


person Shabbir Mala    schedule 09.04.2017    source источник
comment
Пожалуйста, опубликуйте код U-SQL, который вы используете.   -  person wBob    schedule 10.04.2017
comment
Боб, я добавил фрагмент кода в свои вопросы. Заранее спасибо.   -  person Shabbir Mala    schedule 10.04.2017
comment
Если ваше соединение приводит к увеличению объема данных, вероятной причиной является дублирование значений в столбцах соединения. Если значение присутствует 100 раз в левой таблице и 1000 раз в правой таблице, это приведет к 100 000 строк на выходе (декартово произведение). Не могли бы вы проверить это, например, загрузив данные в Power BI?   -  person Alexandre Gattiker    schedule 10.04.2017
comment
Да. Александр. Это больше похоже на декартову проблему. Мне пока хорошо. Спасибо!   -  person Shabbir Mala    schedule 10.04.2017


Ответы (2)


Похоже, вы не используете таблицы ADLA, а просто имеете дело с файлами непосредственно в U-SQL. Это нормально, но я просто хотел проверить, так как вы упомянули таблицы. Кроме того, код выводит @purchase, которого нет в сценарии — я предполагаю, что вы действительно выводите правильный набор строк в своем реальном сценарии.

Несколько вопросов:

  • Вы проверили формат/содержимое входных файлов в ADLS? Вы сделали вывод @file1 и @file2, чтобы проверить, что они создают то, что вы ожидаете?
  • Откуда вы знаете, что выходной файл увеличивается до 5 ГБ? Из графика работы? Вы можете это прикрепить?
  • Вы используете столбец «дата» для чего-то?
  • Является ли ваш столбец соединения одним столбцом и какого он типа?
person OmidA    schedule 10.04.2017
comment
Да. Я пока не использую таблицы ADLA. Хотя пробовал и так, результат тот же. Я проверил вывод, запустив задания извлечения, и они показывают все ожидаемое содержимое. Да, оно отображается на графике заданий. Столбец соединения в типе данных int и его одноосновное отношение между двумя таблицами. Я прикрепил снимок экрана с графиком работы в вопросе. Пожалуйста, проверьте. - person Shabbir Mala; 10.04.2017

Если f1.join1 == f2.join2 на самом деле сравнивает (более или менее) уникальный ключ с другим (более или менее) уникальным ключом, вы должны получить разумное количество строк.

Но многие люди реализуют CROSS JOIN, используя тот же синтаксис. Например, f1.join1 может быть 1 во всей таблице f1, а f2.join2 также может быть 1 во всей таблице f2. Эти значения данных приведут к тому, что ваш вывод будет CROSS JOIN из двух таблиц.

person Jasper    schedule 18.10.2017