2017-03-28 8 views
8

저는 SQL Datawarehouse에서 왔으며 플랫 피드에서 차원 및 팩트 테이블을 생성합니다. 일반적인 데이터웨어 하우스 프로젝트에서 우리는 피드를 사실과 차원으로 나눕니다. 예 :하이브에서 스타 스키마 생성

enter image description here

나는 하둡 완전히 새로운 오전과 내가 하이브에서 데이터웨어 하우스를 구축 할 수 있음을 알게되었습니다. 이제 하이브에서 기본 키로 적용 할 수있는 guid 사용에 익숙합니다. 따라서 아래의 전략은 하이브에 사실과 차원을로드하는 올바른 방법입니까?

  1. 하이브 테이블로 소스 데이터로드. 말하십시오 Sales_Data_Warehouse
  2. sales_data_warehouse에서 차원 생성; 예 :

    SELECT New_Guid(), Customer_Name 제, Customer_Address Sales_Data_Warehouse 모든 치수는 다음 수행 'Fact_Key'AS

    SELECT New_Guid()와 같은 팩트 테이블을로드하는

  3. , Customer.Customer_Key, 상점에서 .Store_Key ... Sales_Data_Warehouse AS '소스'FROM 는 는 source.Customer_Name = Customer.Customer_Name에 Customer_Dimension 고객을 가입하고 source.Customer_Address = Customer.Customer_Address Store.Store_Name = Source.St ON Store_Dimension AS '스토어'가입 ore_Name 가 ON Product_Dimension AS '제품'을 가입 .....

이 내 사실과 차원 테이블 하이브를로드해야하는 방법이 있나요?

또한 일반적으로웨어 하우스 프로젝트에서 차원 속성을 업데이트해야합니다 (예 : Customer_Address가 다른 것으로 변경됨) 또는 사실 테이블 외래 키를 업데이트해야합니다 (거의 발생하지 않지만 발생합니다). 그래서 어떻게 하이브에 INSERT-UPDATE로드를 할 수 있습니까? (우리가 TSQL의 SSIS 또는 MERGE 문에서 Lookup을 수행하는 것처럼)?

+1

당신이하는 방식이 정확합니다. Hive는 버전 0.14 –

+0

에서 업데이트 쿼리를 지원합니다. 핵심 개념은 없습니다 –

+0

고객 이름이 변경된 경우 두 테이블 "고객"테이블과 파생 테이블을 모두 업데이트해야합니다 –

답변

1

하둡 및 하이브에서 여전히 차원 모델의 이점을 얻습니다. 그러나 Hadoop의 일부 기능을 사용하려면 차원 모델링에 대한 표준 접근 방식을 약간 채택해야합니다.

하둡 파일 시스템은 변경 불가능합니다. 데이터를 추가 만하고 업데이트 할 수는 없습니다. 결과적으로 차원 테이블에 레코드를 추가 할 수 있습니다 (하이브가 업데이트 기능을 추가하고 트랜잭션이 다소 버그가있는 것처럼 보임). 천천히 변화하는 Hadoop의 치수가 기본 동작이됩니다. 차원 테이블에서 가장 최신의 최신 레코드를 얻으려면 세 가지 옵션이 있습니다. 먼저 창 함수를 사용하여 최신 레코드를 검색하는 뷰를 만들 수 있습니다. 두 번째로 최신 상태를 다시 만드는 백그라운드에서 실행되는 압축 서비스를 가질 수 있습니다. 셋째, 차원 테이블을 가변 저장 공간에 저장할 수 있습니다. 두 가지 유형의 저장소에서 HBase 및 페더레이션 쿼리.

데이터가 HDFS를 통해 배포되는 방식으로 데이터를 조인하는 데 비용이 많이 듭니다. 분산 관계형 데이터베이스 (MPP)에서 클러스터의 동일한 노드에있는 동일한 기본 키와 외래 키를 사용하여 레코드를 공동 위치시킬 수 있습니다. 이렇게하면 매우 큰 테이블을 조인하는 데 상대적으로 비용이 적게 듭니다. 조인을 수행하기 위해 네트워크를 통해 이동할 필요가 없습니다. 이것은 Hadoop과 HDFS에서 매우 다릅니다. HDFS 테이블은 클러스터에서 큰 덩어리로 분할되어 노드에 분산됩니다. 개인 기록과 키가 클러스터 전체에 퍼져 나가는 방법에 대해서는 어떠한 통제도하지 않습니다. 결과적으로 두 개의 매우 큰 테이블에 대한 Hadoop 조인은 데이터가 네트워크를 통해 이동해야하므로 비용이 많이 듭니다. 가능한 경우 조인을 피해야합니다.대규모 팩트 및 차원 테이블의 경우 차원 테이블을 팩트 테이블로 직접 표준화 해제 할 수 있습니다. 두 개의 매우 큰 트랜잭션 테이블의 경우, 부모 테이블 내부에 자식 테이블의 레코드를 중첩하고 런타임에 데이터를 평평하게 배치 할 수 있습니다. 우리는 BigQuery/Postgres 등의 array_agg와 같은 SQL 확장을 사용하여 팩트 테이블의 여러 곡물을 처리 할 수 ​​있습니다.

대리 키의 유용성에 대해서도 질문 할 것입니다. 왜 자연 키를 사용하지 않습니까? 어쩌면 복잡한 복합 키의 성능이 문제가 될 수 있지만 대리 키는 실제로 유용하지 않으며 결코 사용하지 않습니다.