Python 플러그 인

Python 플러그 인은 Python 스크립트를 사용하여 UDF(사용자 정의 함수)를 실행합니다. Python 스크립트는 테이블 형식 데이터를 입력으로 가져오고 테이블 형식 출력을 생성합니다. 플러그 인의 런타임은 클러스터의 노드에서 실행되는 샌드박스에서 호스트됩니다.

Syntax

T|evaluate [hint.distribution= (single | per_node)] [hint.remote= (auto | local)] python(output_schema,스크립트 [,script_parameters] [,external_artifacts][,spill_to_disk])

구문 규칙에 대해 자세히 알아봅니다.

매개 변수

이름 형식 필수 Description
output_schema string ✔️ type Python 코드에서 반환하는 테이블 형식 데이터의 출력 스키마를 정의하는 리터럴입니다. 형식은 ColumnName:ColumnType[, ...])입니다typeof(. 예를 들어 입니다typeof(col1:string, col2:long). 입력 스키마를 확장하려면 구문을 typeof(*, col1:string, col2:long)사용합니다.
스크립트 string ✔️ 실행할 유효한 Python 스크립트입니다. 여러 줄 문자열을 생성하려면 사용량 팁을 참조하세요.
script_parameters dynamic Python 스크립트에 예약된 kargs 사전으로 전달할 이름 값 쌍의 속성 모음입니다. 자세한 내용은 예약된 Python 변수를 참조하세요.
hint.distribution string 여러 클러스터 노드에 분산될 플러그 인의 실행에 대한 힌트입니다. 기본값은 single입니다. single는 스크립트의 단일 instance 전체 쿼리 데이터를 통해 실행될 것임을 의미합니다. per_node는 Python 블록 이전의 쿼리가 분산되면 스크립트의 instance 포함된 데이터의 각 노드에서 실행됩니다.
hint.remote string 이 힌트는 클러스터 간 쿼리와만 관련이 있습니다. 기본값은 auto입니다. auto 은 서버가 Python 코드가 실행되는 클러스터를 자동으로 결정한다는 것을 의미합니다. 값을 로 설정하면 local 로컬 클러스터에서 Python 코드를 강제로 실행합니다. 원격 클러스터에서 Python 플러그 인이 비활성화된 경우 사용합니다.
external_artifacts dynamic 클라우드 스토리지에서 액세스할 수 있는 아티팩트 이름 및 URL 쌍의 속성 모음입니다. 자세한 내용은 외부 아티팩트 사용을 참조하세요.
spill_to_disk bool 입력 테이블을 Python 샌드박스로 직렬화하는 대체 방법을 지정합니다. 큰 테이블을 직렬화하려면 직렬화를 가속화하고 샌드박스 메모리 사용량을 크게 줄이도록 설정합니다 true . 기본값은 true입니다.

예약된 Python 변수

다음 변수는 Kusto 쿼리 언어 Python 코드 간의 상호 작용을 위해 예약되어 있습니다.

  • df: 데이터 프레임으로 입력 테이블 형식 데이터(위의 값 T )입니다 pandas .
  • kargs: Python 사전으로 script_parameters 인수의 값입니다.
  • resultpandas: Python 스크립트에서 만든 DataFrame으로, 해당 값은 플러그 인 뒤에 있는 Kusto 쿼리 연산자에 전송되는 테이블 형식 데이터가 됩니다.

플러그 인을 사용하도록 설정

플러그 인은 기본적으로 사용하지 않도록 설정됩니다. 시작하기 전에 필수 구성 요소 목록을 검토합니다. 플러그 인을 사용하도록 설정하고 Python 이미지 버전을 선택하려면 클러스터에서 언어 확장 사용을 참조하세요.

Python 샌드박스 이미지

Python 이미지의 버전을 변경하려면 클러스터에서 Python 언어 확장 이미지 변경을 참조하세요.

다른 Python 이미지에 대한 패키지 목록을 보려면 Python 패키지 참조를 참조하세요.

참고

  • 기본적으로 플러그 인은 numpynp 로, pandas를pd로 가져옵니다. 필요에 따라 필요에 따라 다른 모듈을 가져올 수 있습니다.
  • 일부 패키지는 플러그 인이 실행되는 샌드박스에서 적용되는 제한 사항과 호환되지 않을 수 있습니다.

쿼리 및 업데이트 정책에서 수집 사용

  • 다음과 같은 쿼리에서 플러그 인을 사용합니다.
    • 원본 테이블이 스트리밍이 아닌 수집을 사용하도록 수집되는 업데이트 정책의 일부로 정의됩니다.
    • 와 같이 .set-or-append쿼리에서 수집하는 명령의 일부로 를 실행합니다.
  • 스트리밍 수집을 사용하여 원본 테이블을 수집하는 업데이트 정책의 일부로 정의된 쿼리에서는 플러그 인을 사용할 수 없습니다.

예제

range x from 1 to 360 step 1
| evaluate python(
//
typeof(*, fx:double),               //  Output schema: append a new fx column to original table 
```
result = df
n = df.shape[0]
g = kargs["gain"]
f = kargs["cycles"]
result["fx"] = g * np.sin(df["x"]/n*2*np.pi*f)
```
, bag_pack('gain', 100, 'cycles', 4)    //  dictionary of parameters
)
| render linechart 

쿼리 결과를 보여 주는 사인 데모의 스크린샷

print "This is an example for using 'external_artifacts'"
| evaluate python(
    typeof(File:string, Size:string), ```if 1:
    import os
    result = pd.DataFrame(columns=['File','Size'])
    sizes = []
    path = '.\\\\Temp'
    files = os.listdir(path)
    result['File']=files
    for file in files:
        sizes.append(os.path.getsize(path + '\\\\' + file))
    result['Size'] = sizes
    ```,
    external_artifacts = 
        dynamic({"this_is_my_first_file":"https://kustoscriptsamples.blob.core.windows.net/samples/R/sample_script.r",
                 "this_is_a_script":"https://kustoscriptsamples.blob.core.windows.net/samples/python/sample_script.py"})
)
파일 크기
this_is_a_script 120
this_is_my_first_file 105

성능 팁

  • 플러그 인의 입력 데이터 세트를 필요한 최소 크기(열/행)로 줄입니다.
    • 가능한 경우 Kusto의 쿼리 언어로 원본 데이터 세트에 필터를 사용합니다.
    • 원본 열의 하위 집합에 대해 계산을 수행하려면 플러그 인을 호출하기 전에 해당 열만 프로젝팅합니다.
  • 스크립트의 논리를 배포할 수 있을 때마다 를 사용합니다 hint.distribution = per_node .
    • 입력 데이터 세트를 분할하는 데 파티션 연산 자를 사용할 수도 있습니다.
  • 가능하면 Kusto의 쿼리 언어를 사용하여 Python 스크립트의 논리를 구현합니다.

사용 팁

  • 쿼리 편집기에서 Python 스크립트가 포함된 여러 줄 문자열을 생성하려면 즐겨 찾는 Python 편집기(Jupyter, Visual Studio Code, PyCharm 등)에서 Python 스크립트를 복사하여 쿼리 편집기에 붙여넣은 다음, 연속된 3개의 백틱이 포함된 줄 사이에 전체 스크립트를 묶습니다. 예를 들면 다음과 같습니다.

    ```
    python code
    ```

  • 연산자를externaldata 사용하여 Azure Blob Storage와 같은 외부 위치에 저장한 스크립트의 콘텐츠를 가져옵니다.

예제

    let script = 
        externaldata(script:string)
        [h'https://kustoscriptsamples.blob.core.windows.net/samples/python/sample_script.py']
        with(format = raw);
    range x from 1 to 360 step 1
    | evaluate python(
        typeof(*, fx:double),
        toscalar(script), 
        bag_pack('gain', 100, 'cycles', 4))
    | render linechart 

외부 아티팩트 사용

클라우드 스토리지의 외부 아티팩트가 스크립트에 사용할 수 있고 런타임에 사용할 수 있습니다.

외부 아티팩트 속성에서 참조하는 URL은 다음이어야 합니다.

참고

관리 ID를 사용하여 외부 아티팩트를 인증하는 경우 사용량은 SandboxArtifacts 클러스터 수준 관리 ID 정책에 정의되어야 합니다.

아티팩트가 로컬 임시 디렉터리 .\Temp에서 사용할 수 있도록 스크립트에 사용할 수 있습니다. 속성 모음에 제공된 이름은 로컬 파일 이름으로 사용됩니다. 예제를 참조하세요.

외부 패키지 참조에 대한 자세한 내용은 Python 플러그 인용 패키지 설치를 참조하세요.

외부 아티팩트 캐시 새로 고침

쿼리에 사용된 외부 아티팩트 파일은 클러스터에 캐시됩니다. 클라우드 스토리지에서 파일을 업데이트하고 클러스터와 즉시 동기화해야 하는 경우 .clear 클러스터 캐시 external-artifacts 명령을 사용할 수 있습니다. 이 명령은 캐시된 파일을 지우고 후속 쿼리가 최신 버전의 아티팩트와 함께 실행되도록 합니다.

Python 플러그 인용 패키지 설치

다음과 같은 이유로 패키지를 직접 설치해야 할 수 있습니다.

  • 패키지는 비공개이며 사용자 고유의 패키지입니다.
  • 패키지는 공용이지만 플러그 인의 기본 이미지에 포함되지 않습니다.

다음과 같이 패키지를 설치합니다.

사전 요구 사항

  1. 클러스터와 동일한 위치에서 패키지를 호스트하는 Blob 컨테이너를 만듭니다. 예를 들어 https://artifactswestus.blob.core.windows.net/python클러스터가 미국 서부에 있다고 가정합니다.

  2. 해당 위치에 대한 액세스를 허용하도록 클러스터의 설명선 정책을 변경합니다.

    • 이 변경에는 AllDatabasesAdmin 권한이 필요합니다.

    • 예를 들어 에 있는 https://artifactswestus.blob.core.windows.net/pythonBlob에 대한 액세스를 사용하도록 설정하려면 다음 명령을 실행합니다.

    .alter-merge cluster policy callout @'[ { "CalloutType": "sandbox_artifacts", "CalloutUriRegex": "artifactswestus\\.blob\\.core\\.windows\\.net/python/","CanCall": true } ]'
    

패키지 설치

  1. PyPi 또는 다른 채널의 퍼블릭 패키지의 경우 패키지 및 해당 종속성을 다운로드합니다.

    • 로컬 Windows Python 환경의 cmd 창에서 다음을 실행합니다.
    pip wheel [-w download-dir] package-name.
    
  2. 필요한 패키지와 해당 종속성이 포함된 zip 파일을 만듭니다.

    • 프라이빗 패키지의 경우 패키지의 폴더와 해당 종속성의 폴더를 압축합니다.
    • 퍼블릭 패키지의 경우 이전 단계에서 다운로드한 파일을 압축합니다.

    참고

    • Python 엔진 및 샌드박스 런타임 플랫폼과 호환되는 패키지를 다운로드해야 합니다(현재 Windows의 경우 3.6.5).
    • 부모 폴더가 .whl 아닌 파일 자체를 압축해야 합니다.
    • 기본 샌드박스 이미지에서 동일한 버전이 이미 있는 패키지의 파일을 건너뛸 .whl 수 있습니다.
  3. 1단계부터 아티팩트 위치의 Blob에 압축된 파일을 업로드합니다.

  4. 플러그 인을 호출합니다 python .

    • external_artifacts 이름의 속성 모음과 zip 파일(SAS 토큰을 포함한 Blob의 URL)에 대한 참조를 사용하여 매개 변수를 지정합니다.
    • 인라인 Python 코드에서 sandbox_utils 를 가져와 Zipackage 서 zip 파일의 이름으로 해당 install() 메서드를 호출합니다.

예제

가짜 데이터를 생성하는 Faker 패키지를 설치합니다.

range ID from 1 to 3 step 1 
| extend Name=''
| evaluate python(typeof(*), ```if 1:
    from sandbox_utils import Zipackage
    Zipackage.install("Faker.zip")
    from faker import Faker
    fake = Faker()
    result = df
    for i in range(df.shape[0]):
        result.loc[i, "Name"] = fake.name()
    ```,
    external_artifacts=bag_pack('faker.zip', 'https://artifacts.blob.core.windows.net/kusto/Faker.zip?*** REPLACE WITH YOUR SAS TOKEN ***'))
ID 속성
1 게리 타피아
2 엠마 에반스
3 애슐리 보웬

Python 플러그 인을 사용하는 UDF 함수의 더 많은 예제는 Functions 라이브러리를 참조하세요.

Python 플러그 인은 Python 스크립트를 사용하여 UDF(사용자 정의 함수)를 실행합니다. Python 스크립트는 테이블 형식 데이터를 입력으로 가져오고 테이블 형식 출력을 생성합니다.

Syntax

T|evaluate [hint.distribution= (single | per_node)] [hint.remote= (auto | local)] python(output_schema,스크립트 [,script_parameters] [,spill_to_disk])

구문 규칙에 대해 자세히 알아보세요.

매개 변수

이름 형식 필수 Description
output_schema string ✔️ type Python 코드에서 반환되는 테이블 형식 데이터의 출력 스키마를 정의하는 리터럴입니다. 형식은 ColumnName:ColumnType[, ...])입니다typeof(. 예를 들어 입니다typeof(col1:string, col2:long). 입력 스키마를 확장하려면 구문을 typeof(*, col1:string, col2:long)사용합니다.
스크립트 string ✔️ 실행할 유효한 Python 스크립트입니다. 여러 줄 문자열을 생성하려면 사용량 팁을 참조하세요.
script_parameters dynamic Python 스크립트에 예약된 kargs 사전으로 전달할 이름 값 쌍의 속성 모음입니다. 자세한 내용은 예약된 Python 변수를 참조하세요.
hint.distribution string 여러 클러스터 노드에 분산될 플러그 인의 실행에 대한 힌트입니다. 기본값은 single입니다. single는 스크립트의 단일 instance 전체 쿼리 데이터에 대해 실행될 것임을 의미합니다. per_node는 Python 블록 이전의 쿼리가 분산되면 스크립트의 instance 포함된 데이터에서 각 노드에서 실행됩니다.
hint.remote string 이 힌트는 클러스터 간 쿼리에만 관련이 있습니다. 기본값은 auto입니다. auto 는 서버가 Python 코드가 실행되는 클러스터를 자동으로 결정한다는 것을 의미합니다. 값을 로 설정하면 local 로컬 클러스터에서 Python 코드를 강제로 실행합니다. 원격 클러스터에서 Python 플러그 인이 사용하지 않도록 설정된 경우 사용합니다.
spill_to_disk bool 입력 테이블을 Python 샌드박스로 serialize하는 대체 방법을 지정합니다. 큰 테이블을 직렬화하려면 이를 로 true 설정하여 직렬화 속도를 향상시키고 샌드박스 메모리 사용량을 크게 줄입니다. 기본값은 true입니다.

예약된 Python 변수

다음 변수는 Kusto 쿼리 언어 Python 코드 간의 상호 작용을 위해 예약되어 있습니다.

  • df: 데이터 프레임으로 입력 테이블 형식 데이터(위의 값 T )입니다 pandas .
  • kargs: Python 사전으로 script_parameters 인수의 값입니다.
  • resultpandas: Python 스크립트에서 만든 DataFrame으로, 해당 값은 플러그 인 뒤에 있는 Kusto 쿼리 연산자에 전송되는 테이블 형식 데이터가 됩니다.

플러그 인을 사용하도록 설정

플러그 인은 기본적으로 사용하지 않도록 설정됩니다. 시작하기 전에 KQL 데이터베이스에서 Python 플러그 인을 사용하도록 설정합니다 .

Python 샌드박스 이미지

다른 Python 이미지에 대한 패키지 목록을 보려면 Python 패키지 참조를 참조하세요.

참고

  • 기본적으로 플러그 인은 numpynp 로 가져오고 pandas를pd로 가져옵니다. 필요에 따라 다른 모듈을 가져올 수 있습니다.
  • 일부 패키지는 플러그 인이 실행되는 샌드박스에 의해 적용되는 제한 사항과 호환되지 않을 수 있습니다.

쿼리 및 업데이트 정책에서 수집 사용

  • 다음과 같은 쿼리에서 플러그 인을 사용합니다.
    • 소스 테이블이 스트리밍이 아닌 수집을 사용하도록 수집되는 업데이트 정책의 일부로 정의됩니다.
    • 와 같이 .set-or-append쿼리에서 수집하는 명령의 일부로 를 실행합니다.
  • 스트리밍 수집을 사용하여 원본 테이블을 수집하는 업데이트 정책의 일부로 정의된 쿼리에서는 플러그 인 사용할 수 없습니다.

예제

range x from 1 to 360 step 1
| evaluate python(
//
typeof(*, fx:double),               //  Output schema: append a new fx column to original table 
```
result = df
n = df.shape[0]
g = kargs["gain"]
f = kargs["cycles"]
result["fx"] = g * np.sin(df["x"]/n*2*np.pi*f)
```
, bag_pack('gain', 100, 'cycles', 4)    //  dictionary of parameters
)
| render linechart 

쿼리 결과를 보여 주는 사인 데모의 스크린샷

성능 팁

  • 플러그 인의 입력 데이터 세트를 필요한 최소 크기(열/행)로 줄입니다.
    • 가능한 경우 Kusto의 쿼리 언어를 사용하여 원본 데이터 세트에서 필터를 사용합니다.
    • 원본 열의 하위 집합에 대해 계산을 수행하려면 플러그 인을 호출하기 전에 해당 열만 프로젝트합니다.
  • 스크립트의 논리를 배포할 수 있을 때마다 를 사용합니다 hint.distribution = per_node .
    • 입력 데이터 세트를 분할하는 데 파티션 연산 자를 사용할 수도 있습니다.
  • 가능하면 Kusto의 쿼리 언어를 사용하여 Python 스크립트의 논리를 구현합니다.

사용 팁

  • 쿼리 편집기에서 Python 스크립트가 포함된 여러 줄 문자열을 생성하려면 즐겨 찾는 Python 편집기(Jupyter, Visual Studio Code, PyCharm 등)에서 Python 스크립트를 복사하여 쿼리 편집기에 붙여넣은 다음, 연속된 3개의 백틱이 포함된 줄 사이에 전체 스크립트를 묶습니다. 예를 들면 다음과 같습니다.

    ```
    python code
    ```

  • 연산자를externaldata 사용하여 Azure Blob Storage와 같은 외부 위치에 저장한 스크립트의 콘텐츠를 가져옵니다.

예제

    let script = 
        externaldata(script:string)
        [h'https://kustoscriptsamples.blob.core.windows.net/samples/python/sample_script.py']
        with(format = raw);
    range x from 1 to 360 step 1
    | evaluate python(
        typeof(*, fx:double),
        toscalar(script), 
        bag_pack('gain', 100, 'cycles', 4))
    | render linechart 

Python 플러그 인을 사용하는 UDF 함수의 더 많은 예제는 Functions 라이브러리를 참조하세요.

이 기능은 지원되지 않습니다.