2016-10-06 4 views
1

У меня есть результат запроса SELECT в переменной, и теперь я хочу выполнить итерацию результата запроса по строкам, чтобы сделать некоторые обработки, как поиск определенного шаблона. Например, модель может быть следующим:Как выполнить итерацию результата запроса SELECT для поиска шаблона строки с использованием U-SQL

a, b, c, d, e 
b, c, d, e, f 
c, d, e, f, g 

И результат запроса SELECT, в CSV может быть:

1, 2, 3, 4, 5 
3, 4, 5, 6, 7 
a, b, c, d, e 
b, c, d, e, f 
c, d, e, f, g 
5, 6, 7, 8, 9 

Я видел кое-что о процессе заявления, используя пользовательский экстрактор, но это способ сделать это? Я не уверен, как работает этот ПРОЦЕСС и экстрактор.

https://msdn.microsoft.com/en-us/library/azure/mt621322.aspx

Спасибо за любую помощь.

+0

Не так ясно, как вы получаете от своего первого набора результатов до второго? Какова логика? Возможно, вы можете выполнить довольно обычную операцию набора в паре с некоторой обработкой строк .net, чтобы получить результат без необходимости писать полный пользовательский экстрактор. – wBob

+0

Привет @wBob, я хочу извлечь шаблон в первом наборе из второго набора. Подумайте, что второй набор представляет собой набор данных или результат, полученный из запроса SELECT. Мне нужно найти эту конкретную модель в этом порядке. Я знаю, что я мог бы сделать OR в предложении WHERE, но это могло бы дать другие записи, которые не входят в этот шаблон. –

ответ

1

Я не думаю, что вам нужно итерации. Будет ли более основанный на наборе подход работать для вас? Попробуйте этот образец U-SQL, который я создал. В принципе, если есть соответствие, результат будет в файле, если нет совпадения, файл будет пустым.

// Set the search pattern 
@pattern = 
    SELECT * 
    FROM (VALUES 
      ("a", "b", "c", "d", "e"), 
      ("b", "c", "d", "e", "f"), 
      ("c", "d", "e", "f", "g") 
      ) AS t (col1, col2, col3, col4, col5); 


// Get the file to search 
@input = 
    EXTRACT col1 string, 
      col2 string, 
      col3 string, 
      col4 string, 
      col5 string 
    FROM "/input/input.csv" 
    USING Extractors.Csv(); 


// Add rowIds 
@pattern = 
    SELECT ROW_NUMBER() OVER() AS rowId, * 
    FROM @pattern; 

@input = 
    SELECT ROW_NUMBER() OVER() AS rowId, * 
    FROM @input; 


// Check the same rows appear in the same order 
@temp = 
    SELECT i.rowId, 
      p.rowId == null ? 0 : ROW_NUMBER() OVER(ORDER BY p.rowId) AS rowId2 // Restarts the row numbering when there is a match 
    FROM @input AS i 
     LEFT OUTER JOIN 
      @pattern AS p 
     ON i.col1 == p.col1 
      AND i.col2 == p.col2 
      AND i.col3 == p.col3 
      AND i.col4 == p.col4 
      AND i.col5 == p.col5; 


@output = 
    SELECT p.* 
    FROM @pattern AS p 
     INNER JOIN 
      @temp AS t 
     ON p.rowId == t.rowId2; 


@pattenRecords = 
    SELECT COUNT(*) AS records 
    FROM @pattern; 


@records = 
    SELECT COUNT(*) AS records 
    FROM @output; 


// Join criteria mean output file will be empty if there has not been a match 
@output = 
    SELECT o.* 
    FROM @output AS o 
     CROSS JOIN @records AS r 
     INNER JOIN 
      (
      SELECT * 
      FROM @pattenRecords 
      INTERSECT 
      SELECT * 
      FROM @records 
     ) AS t ON r.records == t.records; 



// Output results 
OUTPUT @output 
    TO "/output/output.csv" 
USING Outputters.Csv(); 

Возможно, существует более простой способ.

+0

Любые отзывы об этом @MichaelRys. Было бы хорошо знать, был ли более простой способ. – wBob

+1

Этот декларативный подход является окончательно хорошим способом. Альтернативы включают в себя запись пользовательского объединителя или перемещение шаблона в файл ресурсов или сложный тип (массив карты) и передачу его в редуктор. Оба более поздних, хотя, вероятно, были бы менее масштабными, чем декларативный подход выше. –