U-SQL

2017-04-05 13 views
1

에있는 데이터의 고유 값을 기반으로 CSV 파일을 여러 파일로 분할합니다. Azure Data Lake Store의 데이터를 가지고 있으며 거기에있는 데이터를 U-SQL을 사용하여 Azure Data Analytic Job으로 처리하고 있습니다. 나는이와 유사한 공간 데이터를 포함하는 여러 CSV 파일이 있습니다U-SQL

File_20170301.csv

longtitude| lattitude | date   | hour | value1 
    ----------+-----------+--------------+------+------- 
    45.121 | 21.123 | 2017-03-01 | 01 | 20 
    45.121 | 21.123 | 2017-03-01 | 02 | 10 
    45.121 | 21.123 | 2017-03-01 | 03 | 50 
    48.121 | 35.123 | 2017-03-01 | 01 | 60 
    48.121 | 35.123 | 2017-03-01 | 02 | 15 
    48.121 | 35.123 | 2017-03-01 | 03 | 80 

File_20170302.csv

longtitude| lattitude | date   | hour | value1 
    ----------+-----------+--------------+------+------- 
    45.121 | 21.123 | 2017-03-02 | 01 | 20 
    45.121 | 21.123 | 2017-03-02 | 02 | 10 
    45.121 | 21.123 | 2017-03-02 | 03 | 50 
    48.121 | 35.123 | 2017-03-02 | 01 | 60 
    48.121 | 35.123 | 2017-03-02 | 02 | 15 
    48.121 | 35.123 | 2017-03-02 | 03 | 80 

각 파일은 다른 일에 대한 데이터를 포함하고 모든 경도 값에 대한 - 경도 조합.

각 longtitude-lattitude 조합에 대해 하나의 파일로 끝날 수 있도록 모든 파일을 병합하고 데이터를 분할하고 싶습니다.

그래서, 내 폴더의 모든 파일을 통해 반복하고 모든 일에 대한 모든 데이터를 추가 한 후, 나는 다음으로 끝날 것 :

longtitude| lattitude | date   | hour | value1 
    ----------+-----------+--------------+------+------- 
    45.121 | 21.123 | 2017-03-01 | 01 | 20 
    45.121 | 21.123 | 2017-03-01 | 02 | 10 
    45.121 | 21.123 | 2017-03-01 | 03 | 50 
    45.121 | 21.123 | 2017-03-02 | 01 | 20 
    45.121 | 21.123 | 2017-03-02 | 02 | 10 
    45.121 | 21.123 | 2017-03-02 | 03 | 50 

File_48_35.csv

File_45_21.csv

longtitude| lattitude | date   | hour | value1 
    ----------+-----------+--------------+------+------- 
    48.121 | 35.123 | 2017-03-01 | 01 | 60 
    48.121 | 35.123 | 2017-03-01 | 02 | 15 
    48.121 | 35.123 | 2017-03-01 | 03 | 80 
    48.121 | 35.123 | 2017-03-02 | 01 | 60 
    48.121 | 35.123 | 2017-03-02 | 02 | 15 
    48.121 | 35.123 | 2017-03-02 | 03 | 80 
  • 데이터에서 longtitude와 latitude의 조합에 대한 고유 한 값 찾기
  • 위의 별개 값 배열을 사용하여 각 조합에 대한 파일을 만들고 두 매개 변수를 기반으로 소스 파일에서 데이터를 추출합니다 (longtitude 및 위도)
  • 내가 고민하는 것은 소스의 두 매개 변수를 기반으로 데이터를 반복 및 추출하는 방법과 조합의 고유 값으로 데이터 소스를 "분할"하는 방법입니다 매개 변수

    답변

    0

    U-SQL은 동적 U-SQL을 직접 지원하지 않지만 "스크립트 스크립트"기술을 사용하여 출력을 만들 수 있습니다. 그런 다음이 출력을 수동으로 실행하거나 Powershell 또는 Azure Data Factory와 같은 것을 사용하여 실행할 수 있습니다.

    here의 예를 부분적으로 기반으로 테스트 데이터를 기반으로 간단한 예제를 만들었습니다.

    // Get the initial fileset 
    @input = 
        EXTRACT longtitude float, 
          lattitude float, 
          date string, 
          hour int, 
          value1 int, 
          filename string 
        FROM "/input/File_201703{filename}" 
        USING Extractors.Csv(); 
    
    
    // Add int version of the long and lat columns for grouping on 
    @working = 
        SELECT *, 
          (int) longtitude AS int_long, 
          (int) lattitude AS int_lat 
        FROM @input; 
    
    
    // Work out the filenames 
    @filenames = 
        SELECT String.Format("File {0}_{1}.csv", int_long, int_lat) AS outputFilename, 
          int_long, 
          int_lat 
        FROM 
        (
         SELECT int_long, 
           int_lat 
         FROM @working 
         GROUP BY int_long, 
           int_lat 
        ) AS x; 
    
    
    // Construct the dynamic usql and output it 
    @output = 
        SELECT x.xsort, "@input = EXTRACT longtitude float, lattitude float, date string, hour int, value1 int, filename string FROM \"input/File_201703{filename}\" USING Extractors.Csv();" AS usql 
        FROM (VALUES (10)) AS x(xsort) 
    
        UNION ALL 
    
        SELECT x.xsort, "@working = SELECT *, (int) longtitude AS int_long, (int) lattitude AS int_lat FROM @input;" AS usql 
        FROM (VALUES (20)) AS x(xsort) 
    
        UNION ALL 
    
        SELECT 30 AS xsort, String.Format("OUTPUT (SELECT * FROM @working WHERE int_long == {0} AND int_lat == {1}) TO \"/output/{2}\" USING Outputters.Csv();", int_long, int_lat, outputFilename) AS usql 
        FROM @filenames; 
    
    
    // Select only the usql column and sort the output 
    @output = 
        SELECT usql 
        FROM @output 
    ORDER BY xsort 
    FETCH 100; 
    
    
    OUTPUT @output 
    TO "/output/dynamic.usql" 
    USING Outputters.Text(delimiter : ' ', quoting : false); 
    
    내가 파일의 개념 보는 것이 좋습니다
    +0

    안녕하세요 @MichaelRys, 위의 동적 접근 방식에 몇 가지 문제가 있습니까? 그것은 개선 될 수 있습니까 아니면 나쁜 생각입니까? 기꺼이받은 모든 의견 :) – wBob

    +0

    나는 그것을 실행하지 않은 동안, 괜찮아 보인다. 성능상의 이유로 파일 이름 생성과 동적 인 U-SQL 생성을 병합했을 수 있습니다. 당신은 기본적으로 위에서 언급 한 U-SQL 방식으로 작성하는 U-SQL을 사용합니다. –

    +0

    데이터베이스 카탈로그에서 데이터를 가져 와서 파티션을 나누고 CSV 파일로 내보내기를 작성하는 것이 좋은지 궁금합니다. 이것이 가능한 해결책일까요? USQL은 여전히 ​​테이블의 데이터를 가져오고 데이터를 CSV로 내보내는 데 사용할 수 있습니다. – FeodorG