콘텐츠로 이동

고급 데이터 매퍼 사용

데이터 매퍼의 고급 사용 기능을 살펴보기 전에 기본 기능을 간단히 복습하면 도움이 됩니다.

데이터 매퍼는 소스 데이터의 열을 대상 데이터 테이블에 매핑하는 데 사용합니다.

소스 검사 메뉴 버튼을 사용하면 소스에서 대상으로 열을 매핑하는 추가 방법을 사용할 수 있습니다.

  • 두 매핑 테이블 모두 채우기: 소스 데이터 테이블의 모든 값을 대상 데이터 테이블로 전파합니다. 기본으로 이렇게 동작합니다.
  • 소스 매핑 테이블만 채우기: 소스 데이터 테이블의 모든 값만 매핑합니다. 소스 열 구조가 변경되어 기존 워크플로를 수정할 때 유용합니다.
  • 대상 매핑 테이블만 채우기: 모든 값을 대상 데이터 테이블에만 전파합니다.

소스 및 대상 열 옵션만으로 부족하면 다음과 같은 여러 방법으로 대상 데이터 테이블에 다른 열을 추가할 수 있습니다.

  • 모두 전파는 이미 있는 열인지와 관계없이 모든 소스 열을 대상 데이터 테이블에 삽입합니다.
  • 선택 항목 전파는 선택한 소스 열만 삽입합니다.
  • 대상 쪽에서 마우스 오른쪽 버튼으로 클릭하고 행 삽입을 선택하면 현재 선택한 행 바로 위에 행이 삽입됩니다.
  • 대상 쪽에서 마우스 오른쪽 버튼으로 클릭하고 행 추가를 선택하면 대상 데이터 테이블의 맨 아래(맨 오른쪽)에 행이 삽입됩니다.

대상 데이터 테이블에서 열을 삭제하려면 원하는 열을 선택한 다음 마우스 오른쪽 버튼으로 클릭하고 삭제를 선택합니다.

대상 데이터 테이블에서 열을 재배치하려면 원하는 열을 선택합니다. 다음 중 하나를 사용할 수 있습니다.

  • 일괄 이동 화살표: 오른쪽 위의 화살표에서 원하는 이동 옵션을 선택합니다.
  • 컨텍스트 메뉴: 마우스 오른쪽 버튼으로 클릭하고 맨 위로 이동, 위로 이동, 아래로 이동 또는 맨 아래로 이동을 선택합니다.

결과를 고유 레코드로만 줄이기

섹션 제목: “결과를 고유 레코드로만 줄이기”

고유한 항목만 반환하려면 고유 메뉴 옵션을 선택합니다. 그러면 소스의 각 열에 대한 확인란 집합이 표시됩니다. 고유한 결과만 반환할 열 옆의 확인란을 선택하면 됩니다.

결과를 집계하려면 요약 메뉴 옵션을 선택합니다. 그러면 대상 데이터 테이블의 각 열에 대한 선택 상자 집합이 표시됩니다. 각 열에 적합한 요약 방법을 선택합니다.

소스 열cust_idamtdtnote대상 열customer_idamountorder_date이름 바꾸기형변환 → decimal이름 바꾸기매핑 안 됨 → 제외
매퍼는 각 소스 열을 대상 열에 연결하며, 그 과정에서 이름을 바꾸고 형식을 변환합니다. 매핑되지 않은 소스 열은 결과에서 제외됩니다.

결과를 집계하려면 요약 메뉴 옵션을 선택합니다. 그러면 대상 데이터 테이블의 각 열에 대한 선택 상자 집합이 표시됩니다. 다음 요약 옵션을 사용할 수 있습니다.

함수 설명
그룹화 기준 값을 기준으로 결과를 그룹화합니다
개수 그룹 내 null이 아닌 관측값의 수
개수(null 포함) 그룹 내 관측값의 수
합계 그룹 내 값의 합계
평균 그룹 내 값의 평균
중앙값 그룹 내 값의 중앙값
최빈값 그룹 내 값의 최빈값
최솟값 그룹 내 값의 최솟값
최댓값 그룹 내 값의 최댓값
첫 번째 정렬 순서에 따른 그룹 내 첫 번째 값
마지막 정렬 순서에 따른 그룹 내 마지막 값
표준 편차 그룹의 불편 표준 편차
표본 표준 편차 그룹의 표본 표준 편차
모집단 표준 편차 그룹의 모집단 표준 편차
분산 그룹의 불편 분산
표본 분산 그룹의 표본 분산
모집단 분산 그룹의 모집단 분산
고급 비그룹화 기준 윈도 함수를 사용할 때의 특수 집계 선택 항목

열에 적합한 요약 방법을 선택하십시오.

REST API 또는 AI 어시스턴트를 통해 단계를 설정할 때는 각 대상 열의 요약이 agg에 지정되며, 단계의 aggregation_type이 같은 선택지를 지정합니다. 데이터 매퍼가 있는 모든 단계는 다음 값을 허용합니다.

키 요약
group 그룹화 기준
dont_group 고급 비그룹화 기준: 열을 그룹화하지도 집계하지도 않으며, 스스로 집계하거나 윈도 연산을 수행하는 식에 사용합니다
count 그룹 내 null이 아닌 관측값의 수
count_null null을 포함한 개수
count_distinct 그룹 내 고유 값의 수
sum 합계
avg 평균
median 중앙값
min 최솟값
max 최댓값
stddev 표준 편차
stddev_samp 표본 표준 편차
stddev_pop 모집단 표준 편차
variance 분산
var_samp 표본 분산

각 대상 열에는 sort를 지정할 수 있습니다. asc, desc, none 중 하나이거나 {ascending, order} 객체입니다. ascending은 true 또는 false입니다. order는 키의 우선순위를 정하는 정수입니다. order가 있는 열이 먼저 번호가 낮은 순으로 정렬되고, 그다음에 나머지 정렬 열이 열 위치 순서로 이어집니다.

윈도 함수를 사용할 때는 집계 방법으로 고급 비그룹화 기준을 선택하십시오. 윈도 함수에는 이미 집계가 내재되어 있으므로 이 특수 선택 항목이 필요합니다.

상수 열에 값을 지정하면 소스 열 값이 지정되어 있더라도 그 값을 재정의하고 열을 지정한 상수 값으로 채웁니다.

소스, 상수, 식을 함께 사용하는 경우

섹션 제목: “소스, 상수, 식을 함께 사용하는 경우”

대상 열은 입력한 항목 중 상수, 식, 소스 열의 순서로 우선하여 값을 가져옵니다. 즉 상수가 가장 우선하고 그다음이 식, 그다음이 소스 열입니다.

따라서 값을 계산하는 열에는 소스가 필요하지 않습니다. 상수나 식이 이미 값을 결정하며 함께 지정한 소스는 무시되므로 비워 두십시오. 들어오는 데이터에서 열을 그대로 매핑하거나, 이름을 바꾸거나, 그 과정에서 형식을 변환할 때 소스를 채웁니다.

식은 소스 셀이 아니라 get_column(table, 'Column Name')을 사용하여 들어오는 열을 이름으로 읽습니다.

데이터 매퍼는 열의 데이터에 변환을 적용하는 편리한 포인트 앤 클릭 클리너 기능을 제공합니다.

클리닝 작업에는 다음 범주가 포함됩니다.

  • 텍스트 공백 제거
  • 텍스트 서식
  • 텍스트 변환
  • NULL 값으로 또는 NULL 값에서 변환
  • 숫자 서식
  • 날짜 구문 분석

클리너에서 선택한 항목은 하나의 통합 식으로 변환되며, 식 정보에서 확인할 수 있습니다.

데이터 매퍼의 식은 PlaidCloud에서 가장 강력하고 유연한 개념 중 하나입니다. 매우 큰 데이터에서도 뛰어난 성능을 내면서 거의 무제한의 유연성을 제공합니다.

식은 Python SQLAlchemy 구문과 PlaidCloud에서 제공하는 몇 가지 추가 도우미 함수를 사용하여 작성합니다. 따라서 PlaidCloud는 기반 데이터 웨어하우스(예: Greenplum, SAP HANA, Redshift 등)의 모든 기능을 직접 사용할 수 있습니다. 또한 SQLAlchemy 연산을 빠르게 참고할 수 있는 자료가 공개적으로 많이 있습니다. 표준 SQLAlchemy 구문을 사용하므로 PlaidCloud는 또 하나의 도메인 특화 구문을 만드는 흔한 함정을 피합니다.

식 편집기는 열의 식 셀을 두 번 클릭하여 엽니다. 열면 왼쪽에 열 목록이, 오른쪽에 풍부한 함수 라이브러리가 표시됩니다.

식을 편집기에 직접 입력해도 되지만, 일반적으로는 포인트 앤 클릭으로 함수와 열을 선택하여 시작하는 것이 더 쉽습니다. 함수 라이브러리에는 다음 그룹이 포함됩니다.

  • 조건
  • 열별 조건
  • 변환
  • 날짜
  • 수학
  • 텍스트
  • 요약
  • 윈도 함수 연산
  • 배열
  • JSON
  • PostGIS(지리 공간)
  • 삼각 함수

식을 완성한 후에는 식을 저장해야 열에 적용됩니다.

예제와 식 함수는 식 영역에서 확인하십시오.

cast(x, Float)는 모든 웨어하우스에서 64비트 배정밀도 숫자를 반환하므로 1225541207.71 같은 금액도 모든 자릿수가 유지됩니다. StarRocks에서는 이전에 생략되던 Float 캐스팅이 적용되며, Databend에서는 단정밀도가 아니라 배정밀도입니다. PlaidCloud가 float 데이터로 만드는 Float 열도 배정밀도입니다. 단정밀도 열이 이미 있는 테이블은 다음에 단계가 덮어쓰기로 테이블을 다시 만들 때 배정밀도가 됩니다.

StarRocks에서는 다음과 같이 동작합니다.

  • 큰 정수로 캐스팅하면 약 21억을 넘는 값도 저장됩니다.
  • 정밀도 없이 Numeric으로 캐스팅하면 정수로 반올림하지 않고 최대 10자리까지 소수를 유지합니다.
  • JSON으로 캐스팅이 적용됩니다.

모든 웨어하우스에서, 숫자가 아닌 텍스트를 숫자로 캐스팅하는 경우처럼 변환할 수 없는 값은 단계를 중지시키지 않고 null이 됩니다.

sqlalchemy.literal_column은 SQL 조각을 변경하지 않고 웨어하우스에 그대로 전달하며, 열, 계산, CASE, 함수 호출, 캐스트, 윈도 함수 같은 단일 값을 허용합니다. 서브쿼리((SELECT ... FROM ...))를 담은 literal_column은 거부됩니다. 서브쿼리가 단계에서 선언하지 않은 테이블에 접근하기 때문입니다.

이 절의 규칙은 식을 작성하는 모든 곳, 즉 여기 매퍼, 단계의 필터, 그리고 다른 곳에서 조립하여 플랫폼으로 보낸 쿼리에 적용됩니다. 단계를 저장할 때와 식을 SQL로 변환할 때 다시 검사됩니다.

대신 sqlalchemy.select(...)로 서브쿼리를 만드십시오. 열에 단일 값이 필요하면 .scalar_subquery()를, 서브쿼리에서 선택하려면 .subquery()를 사용합니다.

# Refused
sqlalchemy.literal_column('(SELECT rate FROM fx WHERE fx.cc = t.cc)')
# Supported — a single value in a column
sqlalchemy.select(fx.c.rate).where(fx.c.cc == t.c.cc).scalar_subquery()
# Supported — a table to select from
sqlalchemy.select(fx.c.rate).subquery()

최외곽 연산자가 OR인 literal_column도 거부됩니다. PlaidCloud는 텍스트를 변경하지 않고 그대로 전달하므로, 그 뒤에 추가된 조건은 절반에만 결합됩니다. 예를 들어 a OR b 뒤에 AND region = 'East'가 오면 a OR (b AND region = 'East')로 해석되어 제외하려던 행이 다시 반환됩니다.

괄호를 추가하면 이전처럼 동작합니다.

# Refused
sqlalchemy.literal_column("status = 'open' OR status = 'pending'")
# Supported
sqlalchemy.literal_column("(status = 'open' OR status = 'pending')")

CASE 안이나 이미 괄호로 묶인 경우처럼 식 내부 어디에 있든 논리합은 영향을 받지 않습니다.

XOR는 괄호 여부와 관계없이 어디에 나타나든 거부됩니다. 웨어하우스마다 결합 우선순위가 달라 모든 곳에서 안전한 해석이 없기 때문입니다. 대신 (a AND NOT b) OR (NOT a AND b)처럼 풀어서 작성하십시오.

주석을 포함한 literal_column도 같은 이유로 거부됩니다. 주석은 문 끝까지 이어지므로, 작성한 부분뿐 아니라 PlaidCloud가 식 뒤에 추가하는 내용까지 지워 버립니다.

--는 문의 나머지 부분에 영향을 줄 수 있는 위치에서 거부됩니다. #는 예외 없이 텍스트 어디에서나 거부됩니다. 따라서 따옴표로 묶인 문자열 안이나 Postgres의 #>, #>> JSON 경로 연산자에서도 거부됩니다.

# Refused
sqlalchemy.literal_column("attrs #> '{a,b}'")
sqlalchemy.literal_column("code || '#'")

#는 StarRocks 같은 MySQL 호환 웨어하우스에서 주석을 시작하며, 식을 작성하는 시점에는 PlaidCloud가 어떤 웨어하우스에서 식이 실행될지 알 수 없습니다. 따라서 텍스트 안에 안전하다고 확신할 수 있는 위치가 없으며, 한 엔진에서 따옴표로 묶인 것처럼 보이는 #도 다른 엔진에서는 주석의 시작이 됩니다. 이 문자가 데이터로 필요하면 값으로 전달하십시오.

# Supported
sqlalchemy.func.concat(table.code, sqlalchemy.literal('#'))

.op('...')에서도 같은 두 표기가 거부됩니다.

literal_column을 일반적으로 사용하는 나머지 용도는 영향을 받지 않습니다. literal_column('current_date'), literal_column("CASE WHEN amount > 0 THEN 'p' ELSE 'n' END"), func.count()는 모두 이전처럼 동작합니다. 공백, 점, 따옴표가 포함된 열 이름도 영향을 받지 않으며, 웨어하우스가 대신 따옴표 처리를 해 줍니다.