Salesforce Data 및 C1DataEngine을 사용한 인메모리 데이터 분석 > 블로그 & Tips

본문 바로가기

ComponentOne

블로그 & Tips

Salesforce Data 및 C1DataEngine을 사용한 인메모리 데이터 분석

페이지 정보

작성자 GrapeCity 작성일 21-08-13 10:19 조회 1,867회 댓글 0건

본문

첨부파일

ComponentOne DataEngine(C1DataEngine)은 뛰어난 성능으로 대규모 데이터 집합에서 수백만 개의 레코드를 쿼리, 집계, 분할 및 분석하고 피벗할 수 있는 독립 실행형 라이브러리입니다.


대용량 데이터 집합에 대해 추출, 변환 및 로드(ETL)를 가능하게 하는 인메모리 데이터 관리자 역할을 합니다.


데이터는 SQL Server 또는 열거 가능한 강력한 형식의 개체 컬렉션에서 직접 가져옵니다. 사용자 정의 코드 또는 타사 패키지를 사용하여 대용량 CSV 또는 JSON 파일에서 데이터를 가져올 수도 있습니다. 가져온 데이터는 기본 표에서 기본 커넥터(예: DbConnector 또는 ObjectConnector)를 사용하여 채울 수 있습니다. C1DataEngine의 기본 사항을 자세히 이해하는 데 도움이 되는 C1DataEngine 문서를 참조할 수 있습니다.


이 블로그에서는 ADO.NET 기술을 사용하여 다양한 데이터 소스에서 데이터를 가져올 수 있는 ComponentOne에서 제공하는 또 다른 서비스 구성요소인 C1DataConnector를 사용하여 Salesforce에서 데이터를 가져오는 방법을 보여줍니다.


GrapeCity는 주로 C1DataEngine을 사용하여 가져온 데이터에 피벗 변환을 적용하는 방법에 중점을 둘 것입니다. SQL 데이터에 대한 피벗 변환 구현을 보여주는 이 블로그를 참조하십시오.


Salesforce에서 데이터 가져오기


Salesforce용 C1DataConnector 공급자를 사용하여 Salesforce에서 가져오는 데이터 추출부터 시작해야 합니다.



연결 문자열 정의

아래 코드는 Salesforce 데이터에 연결하기 위한 연결 문자열 정의를 설명하고 사용자 이름, 비밀번호, 보안 토큰 및 기타 OAuth 설정을 포함한 모든 필수 속성에 적절한 값을 제공합니다.

private string GetConnectionString()
{
  const string GCSalesforceServerConnectionString = @"Username=*****; Password=*****; Security Token=*****; OAuth Client Id=*****; OAuth Client Secret=*****;
                                                          OAuth Token Endpoint=https://ap16.salesforce.com/services/oauth2/token;
                                                          Url=https://ap16.salesforce.com/services/data/v42.0";
  return GCSalesforceServerConnectionString;
}


C1Salesforce DataConnector를 사용하여 DataEngine으로 데이터 가져오기


아래 코드는 Workspace 클래스를 인스턴스화하여 C1DataEngine을 초기화하고 Salesforce 서버와의 연결을 설정하기 위해 위에서 정의한 연결 문자열을 전달하여 C1SalesforceConnection 클래스의 인스턴스를 정의합니다.


특정 표 Invoices__c에서 데이터를 가져오는 데 사용되는 쿼리를 정의하기 위해 C1SalesforceCommand 클래스의 인스턴스가 생성되었습니다.


연결 및 명령 개체는 Salesforce에서 데이터를 가져오고 C1DataEngine 작업 영역에서 동일한 표 이름으로 C1DataEngine 작업 영역에 해당 표를 생성하기 위해 DbConnector 클래스의 인스턴스로 전달됩니다.

this._workSpace = new Workspace();
this._workSpace.Init("workspace");
​
C1SalesforceConnection conn = new C1SalesforceConnection(GetConnectionString());
conn.Open();
​
var command = new C1SalesforceCommand(conn, "Select * from Invoices__c");
​
var connector = new DbConnector(this._workSpace, conn, command);
connector.GetData("Invoices__c");
​
this.invoice = this._workSpace.table("Invoices__c");


C1DataEngine 및 Fetch Columns에 대한 쿼리 정의


DataEngine 작업 영역 기본 표를 채운 후 인메모리 데이터 분석을 달성하기 위해 데이터 변환을 수행할 때 사용하려는 열 목록으로 결과 집합을 생성하는 쿼리를 정의합니다. 아래 코드는 쿼리를 정의하고 실행하여 앞으로의 변환에 사용되는 결과 집합을 생성합니다.


C1PivotEngine의 인스턴스도 초기화되어 이 메서드에 매개 변수로 전달된 표 이름을 기반으로 ConnectDataEngine 메서드를 사용하여 C1DataEngine의 표 중 하나에 연결되었습니다. 이 인스턴스는 데이터에 피벗 변환을 적용하여 인메모리 데이터 분석을 수행하는 데 도움이 됩니다.

var queryName = this.QueryName;
var settings = new
{
  invoice.Country__c,
  invoice.ProductName__c,
  invoice.Salesperson__c,
  invoice.OrderDate__c,
  Sales = Op.Sum(invoice.ExtendedPrice__c),
  Quantity = Op.Count(invoice.Quantity__c),
  QuantityTotal = Op.Sum(invoice.Quantity__c)
};
​
this.ExecuteQuery(queryName, settings);
this.engine = new C1PivotEngine();
this.engine.Workspace = this._workSpace;
this.engine.ConnectDataEngine(queryName);


Helper 메서드


아래 코드는 위에 정의된 코드 조각에서 호출된 두 가지 Helper 메서드를 정의하며, 기본적으로 C1DataEngine 쿼리를 실행하는 데 사용됩니다.

private void ExecuteQuery(string queryName, object settings)
{
  dynamic query = GetQuery(queryName, settings);
  query.Query.Execute();
}
​
private dynamic GetQuery(string queryName, object settings)
{
  return this._workSpace.query(queryName, settings);
}



가져온 데이터를 CSV에 저장


작업 영역에 기본 표를 채우고 기본 표에 대한 쿼리를 정의하는 작업을 완료했습니다. 쿼리 또는 쿼리 데이터의 결과 집합은 적절한 API 멤버를 사용하여 JSON 또는 CSV로 내보낼 수 있습니다.


예를 들어 아래 코드는 정적 메서드인 DataList 클래스의 Write 메서드를 사용하여 쿼리 데이터를 CSV로 저장하는 방법을 보여줍니다. 이 메서드의 두 번째 매개 변수인 OutputFormat을 변경하여 동일한 데이터를 JSON에 저장할 수 있습니다.

string file = @"allquery.csv";
using (TextWriter writer = File.CreateText(file))
{
  IDataList dlist = this.GetQueryResults(queryName, settings);
  DataList.Write(dlist, writer, OutputFormat.Csv);
}



C1PivotEngine을 사용하여 Salesforce 데이터에 피벗 변환 적용


위 섹션에서는 Salesforce 데이터에 대한 데이터 추출 프로세스를 완료하고 데이터에 변환을 적용하기 위해 C1PivotEngine 인스턴스를 정의했습니다.

그러면 전달된 행 필드, 열 필드, 값 필드 및 쿼리 이름에 따라 다른 유형의 변환을 수행하는 공통 방법을 정의하여 진행해 보겠습니다.

쿼리 이름은 언급된 변환을 어떤 쿼리 데이터에 적용해야 하는지 지정합니다. 동시에 다른 필드는 단일 열, 다중 열과 같은 변환 유형이나 정렬, 그룹화 또는 필터링과 같은 기타 작업을 결정합니다.

private C1PivotEngine CreateFlexPivotEngine(string queryName, string[] colFields, string[] rowFields, string[] valFields)
{
  var fp = this.engine;          
  fp.BeginUpdate();
  this.engine.ColumnFields.Clear();
  this.engine.RowFields.Clear();
  this.engine.ValueFields.Clear();
  fp.ColumnFields.Add(colFields);
  fp.RowFields.Add(rowFields);
  fp.ValueFields.Add(valFields);
  fp.EndUpdate();
  return fp;
}


피벗 변환


C1DataEngine을 사용하여 데이터에 적용할 수 있는 여러 변환 중 몇 가지를 살펴보겠습니다.


단일 열


단일 열 피벗 변환은 단일 열에 변환을 적용합니다. 즉, 데이터는 단일 열을 기반으로 집계됩니다. 송장 표의 단일 열 변환에 대한 예는 각 국가에서 얼마나 많은 판매가 이루어졌는지를 예시로 들 수 있습니다.


단일 열 피벗 변환을 적용하면 데이터가 국가별로 그룹화되고 해당 특정 국가의 모든 매출이 추가됩니다.


다음은 이 변환을 적용하는 방법을 설명하는 샘플 코드 조각입니다.

public IBindingList SalesByCountry()
{
  var fp = this.CreateFlexPivotEngine(this.QueryName, new string[] { "" }, new string[] { "Country__c" }, new string[] { "Sales" });
  return fp.PivotDefaultView;
}


데이터는 CreateFlexPivotEngine 메서드에 전달된 필드를 기반으로 변환됩니다.


위의 코드 예에서 Country 열의 값은 행 필드로 전달되기 때문에 열에 표시되고 각 국가에 대한 집계된 판매 데이터는 다른 열의 각 국가와 함께 표시됩니다.


다음은 그리드에 표시되는 변환 결과의 빠른 보기입니다.

단일 열


다중 열


다중 열 피벗 변환은 데이터를 여러 열로 그룹화한 다음 집계를 적용합니다.

그룹화는 최상위 열에서 시작하여 이 수준 아래 열로 이어지는 방식으로 진행됩니다.

예를 들어 국가별 총 매출 외에도 특정 국가 내 각 제품의 총 매출을 알기 위해 국가를 최상위 열로, 제품을 2번째 레벨로, 품목별로 매출 집계를 적용할 수 있습니다.


아래 코드는 동일하게 정의됩니다.

public IBindingList ProductSalesByCountry()
{
  var fp = this.CreateFlexPivotEngine(this.QueryName, new string[] { "Country__c" }, new string[] { "ProductName__c" }, new string[] { "Sales" });
  var fld = fp.ColumnFields[0].Filter;
  fld.Condition1.Operator = ConditionOperator.Contains;
  fld.Condition1.Parameter = "m";
  return fp.PivotDefaultView;
}


데이터는 CreateFlexPivotEngine 메서드에 전달된 필드를 기반으로 변환됩니다.


위의 코드 예에서는 각 개별 제품이 들어 있는 열이 있고 이어서 각 개별 국가에서 자체 판매 열이 있는 여러 열에 각 국가의 집계 판매 열이 있습니다.

다중열


그룹화 


그룹화 변환을 이해하려면 날짜 열(예: OrderDate)을 고려하십시오. 열 이름에서 알 수 있듯이 각각의 특정 주문 날짜가 있는 주문 컬렉션이 많이 있지만 각 주문 날짜는 고유하지 않을 수 있습니다.


이 경우 GrapeCity는 매일 총 매출을 평가하려고 합니다. 이는 고려되는 기간이 짧은 경우에만 의미가 있습니다. 그러나 더 긴 기간이라면 날짜를 기준으로 데이터를 분석하는 것이 어렵고 의미가 없을 것입니다.


이러한 시나리오에서는 연도 또는 월과 같은 특정 날짜 속성을 기준으로 데이터를 그룹화할 수 있습니다. 이렇게 하면 데이터가 최소화되고 분석된 데이터라도 귀중한 정보를 제공할 수 있습니다.


따라서 여기에서는 연도 속성 및 각 회계 연도에 대한 집계 분기별 매출을 기반으로 날짜에 그룹화를 적용하는 것을 고려합니다.


이를 위해 피벗 필드의 Formatt 및 RangeType 속성을 사용합니다. 다음은 동일한 내용을 나타내는 코드 샘플입니다.

public IBindingList ProductsSoldInYearQuarterly()
{
  var fp = this.CreateFlexPivotEngine(this.QueryName, new string[] { }, new string[] { "OrderDate", "OrderDate" }, new string[] { "Sales" });
  var year = fp.RowFields[0];
  year.Range.RangeType = RangeType.FiscalYear;
  year.Format = "yyyy";
​
  var month = fp.RowFields[1];
  month.Range.RangeType = RangeType.FiscalQuarter;
​
  return fp.FlexPivotDefaultView;
}


다음은 그리드에서 볼 때 예상되는 출력에 대한 간략한 보기입니다.

그룹화



정렬


정렬 변환을 적용하기 위해 정적 메서드인 DataList 클래스의 Sort 메서드를 사용할 수 있습니다.


IDataList, 열 이름 및 정렬 순서를 매개 변수로 받아 열 이름과 지정된 정렬 순서에 따라 목록을 정렬합니다.

정렬 순서 매개 변수는 부울 매개 변수로 기본값은 True로 설정되어 오름차순 정렬을 의미하며 False로 설정하면 데이터가 내림차순으로 정렬됩니다.


예를 들어 아래 코드는 SalesByCountry 쿼리를 가정하고 Sales 열에 내림차순 정렬을 적용하여 각 국가별로 집계된 Sales를 반환합니다.

var result = this._workSpace.GetQueryData("SalesByCountry");
DataList.Sort(result, "Sales", false); // sort result in descending order by sales column


다음은 그리드에 표시되는 결과 데이터의 빠른 보기입니다.

정렬



필터링


필터링 변환을 적용하려면 C1FlexPivotFilter 유형의 Filter 속성에 액세스하여 피벗 필드에 대해 Filter를 설정할 수 있습니다. C1FlexPivotFilter 클래스 속성은 필터 조건의 수와 필터링 기준을 정의하는 데 사용되는 연산자 유형을 변경하여 다양한 유형의 필터를 적용하는 데 사용할 수 있습니다.


예를 들어 여기에서 ProductSalesByCountry 쿼리에 필터링을 적용하여 국가별 각 제품의 총 매출을 반환합니다. 쿼리를 조정하여 결과 집합을 필터링하여 특정 국가 브라질에 대한 데이터를 반환하는 필터링 기준을 포함하도록 할 것입니다. 다음은 동일한 것을 구현하는 샘플 코드입니다.

public IBindingList FilterESalesByCountry()
{
  var fp = this.CreateFlexPivotEngine(this.QueryName, new string[] { }, new string[] { "Country__c", "ProductName__c" }, new string[] { "Sales" });
  var fld = fp.RowFields[0].Filter;
  fld.Condition1.Operator = ConditionOperator.Equals;
  fld.Condition1.Parameter = "Brazil";
  return fp.PivotDefaultView;
}


다음은 그리드에 표시되는 결과 데이터의 빠른 보기입니다.

필터링


마찬가지로 NotEquals, GreaterThanOrEqualTo, LessThanOrEqualTo 등과 같은 다른 연산자를 사용하여 필요한 결과를 얻을 수 있습니다.


위에서 설명한 변환은 C1DataEngine을 사용하여 적용할 수 있는 다양한 변환 유형의 일부일 뿐입니다.


위에서 설명한 변환을 구현하는 샘플과 다른 몇 가지 예를 여기에서 다운로드하십시오.


C1DataEngine을 사용하여 인메모리 데이터 분석을 수행하여 C1DataEngine의 탁월한 성능을 이해하고 탐색하는 다양한 유형의 변환을 사용해 보십시오.




지금 바로 ComponentOne을 다운로드하여 직접 테스트해보세요!

c1.png

 
  • 페이스북으로 공유
  • 트위터로  공유
  • 구글플러스로 공유
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

그레이프시티 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

태그

인기글

더보기
  • 인기 게시물이 없습니다.
그레이프시티 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@grapecity.com | 전화 : 1670-0583 | 경기도 안양시 동안구 시민대로 230, B-703(관양동, 아크로타워) 그레이프시티(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 Copyright ⓒ 2022 GrapeCity inc.