2016-10-06 1 views
1

변수에서 SELECT 쿼리의 결과를 얻었으므로 지금 행을 통해 쿼리 결과 행을 반복하고 싶습니다. 처리, 특정 패턴을 찾는 것.U-SQL을 사용하여 행 패턴을 찾기 위해 SELECT 쿼리의 결과를 반복하는 방법

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

을 그리고 CSV에서 SELECT 쿼리의 결과가 될 수있다 : 예를 들어, 패턴은 다음이 될 수 나는 사용자 지정 추출기를 사용하여 PROCESS 문에 대해 뭔가를 본 적이

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

안녕하세요 @ 밥, 두 번째 집합에서 첫 번째 집합의 패턴을 추출하고 싶습니다. 두 번째 집합이 SELECT 쿼리의 데이터 집합 또는 결과라고 생각하십시오. 나는 특정 패턴을 그 순서대로 찾아야한다. WHERE 절에서 OR을 수행 할 수는 있지만 가능한 패턴 내에서 다른 항목을 제공 할 수 있음을 알고 있습니다. –

답변

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

이 선언적 접근 방식은 확실히 좋은 방법입니다. 대안으로는 사용자 정의 결합 자 작성 또는 패턴을 자원 파일 또는 복합 유형 (맵 배열)으로 이동하여 감속기로 전달하는 것입니다. 나중에 두 가지 방법 모두 위의 선언적 방법보다 규모가 작을 것입니다. –

관련 문제