Пропустить строку по префиксу

Я пытался использовать Azure Data Lake Analytics для анализа большой группы файлов журналов IIS. Пока я могу заставить это работать для одного файла в лучшем случае, используя что-то вроде этого:

@results = 
     EXTRACT
     s_date DateTime,
     s_time string,
     s_ip string,
     cs_method string,
     cs_uristem string,
     cs_uriquery string,
     s_port int,
     cs_username string,
     c_ip string,
     cs_useragent string,
     sc_status int,
     sc_substatus int,
     sc_win32status int,
     s_timetaken int
FROM @"/input/u_ex151115.log"
USING Extractors.Text(delimiter:' ', skipFirstNRows: 4);

@statuscount = SELECT COUNT(*) AS TheCount,
           sc_status
           FROM @results
           GROUP BY sc_status;

OUTPUT @statuscount
  TO  @"/output/statuscount_results.tsv"
USING Outputters.Tsv();

Как видите, в операторе EXTRACT я пропускаю заголовок файла журнала IIS, используя атрибут skipFirstNRows. Проблема, с которой я сталкиваюсь, заключается в том, что многие файлы журналов, которые я использую в качестве входных данных, содержат заголовки в середине файла, предположительно потому, что пул приложений IIS перезапустился в какой-то момент в течение дня. Когда я пытаюсь включить эти файлы в свой запрос, я получаю следующую ошибку:

Unexpected number of columns in input record at line 14. Expected 14 columns, processed 6 columns out of 6.

Ошибка ссылается на место где-то в файле, где она встретила текст заголовка.

Мой вопрос в том, что с помощью экстрактора текста есть ли способ направить его на пропуск обработки строки на основе начального символа строки или чего-то подобного? Или мне нужно будет написать собственный экстрактор для этого?


person chris.house.00    schedule 14.12.2016    source источник
comment
Вам не обязательно нужен специальный экстрактор. Вы можете импортировать данные как один столбец, а затем уничтожить их. Недавно было несколько вопросов по похожим темам, например здесь и здесь.   -  person wBob    schedule 14.12.2016
comment
Разве Log Parser не очень хорошо справляется с журналами IIS?   -  person wBob    schedule 14.12.2016
comment
В Log Parser нет ничего плохого, но для меня это действительно упражнение в обучении, поэтому использование знакомого мне инструмента не очень помогает в этом :) В любом случае два элемента, которые вы связали, чтобы выглядеть многообещающе, рассмотрят эти варианты. Спасибо!   -  person chris.house.00    schedule 14.12.2016
comment
@wBob ваша первая ссылка указала мне правильное направление, смотрите мой ответ ниже. Спасибо за вашу помощь!   -  person chris.house.00    schedule 14.12.2016


Ответы (1)


На основе документации для средства извлечения текста с использованием slient Параметр приведет к тому, что любые строки, которые не имеют правильного количества столбцов, автоматически завершатся ошибкой, что позволит продолжить обработку до следующей строки. Поскольку заголовок журнала IIS не имеет того же количества столбцов, что и данные журнала, установка для этого атрибута значения true решила мою проблему.

Итак, мой исправленный код выглядит так:

@results = 
     EXTRACT
     s_date DateTime,
     s_time string,
     s_ip string,
     cs_method string,
     cs_uristem string,
     cs_uriquery string,
     s_port int,
     cs_username string,
     c_ip string,
     cs_useragent string,
     sc_status int,
     sc_substatus int,
     sc_win32status int,
     s_timetaken int
FROM @"/input/u_ex140521.log"
USING Extractors.Text(delimiter:' ', silent: true);
@statuscount = SELECT COUNT(*) AS TheCount,
           sc_status
           FROM @results
           GROUP BY sc_status;

OUTPUT @statuscount
  TO  @"/output/statuscount_results.tsv"
  USING Outputters.Tsv();
person chris.house.00    schedule 14.12.2016