2013-09-06 3 views
1

나는 데이터과 같이 MySQL의에서오고있다 ..효율적인 방법

ItemID 
Metric1 
Metric2 
Metric3 

과 같은 데이터가 그래서 하둡을 해내 하이브를 사용 ..

ItemID 
Metric1 
Metric2 
Metric3 

이제 ItemID는 고유 한 식별자입니다. 그래서 나는 다음과 같은 열 설정에 하나 개의 파일로 출력 할 거라고 것은 :

ItemID 
Metric1 (MySQL) 
Metric2 (MySQL) 
Metric3 (MySQL) 
Metric1 (Hadoop) 
Metric2 (Hadoop) 
Metric3 (Hadoop) 

은 거기에 하나 개의 파일을 통해 반복 한 후 다른 파일에 항목 ID 검색하고 출력 한 후 그것을하는 또 다른 방법은 다른 파일에 일치하는 행을? 이것은 실제로 비효율적 인 것처럼 보입니다.

답변

0

Hadoop이 그룹화를 위해 만들어 졌기 때문에 운이 좋은 날입니다. 불행히도, 나는 그것이 비정규 화 된 데이터와 관련되어 있기 때문에 Hive가 SQL에서 이것을 수행하게하는 자연스러운 방법이 없다고 생각합니다. 유일한 귀찮은 부분은 데이터 형식이지만 나중에 자세히 설명하겠습니다.

내 제안은 두 데이터 세트를 고유 항목 ID 값으로로드 한 다음 감속기에서 대조하는 MapReduce 작업을 작성하는 것입니다.

일부 의사 :

mapper for MySQL: 
    output ItemID as the key, Metric# + "(MySQL)" as the value 
mapper for Hadoop: 
    output ItemID as the key, Metric# + "(Hadoop)" as the value 
reducer: 
    output the ItemID, then each item in the iterator 

일부 노트 :

  • 나는 그래서 당신은 데이터를 하둡 또는 MySQL의에서 온 여부를 구별 할 수 MultipleInputs을 사용하는 것이 좋습니다. 각각에 대해 하나의 맵 클래스를 설정 한 다음 해당 맵 클래스를 입력 데이터에 지정합니다.

  • "레코드 구분 기호"가 약간 모호하기 때문에 입력 형식이 다소 괴로운 형식 인 것처럼 보입니다. 어떻게 ItemID의 끝과 다음 ItemID에 도달했는지 어떻게 알 수 있습니까? Metrics와 크게 다른가요? 이 작업을 수행하려면 사용자 정의 입력 형식 또는 레코드 판독기가 필요할 수 있습니다. 어떻게 든 입력 데이터를 변경할 수 있다면 ItemID\tMetric1;Metric2;Metric3으로 읽으므로 인생이 훨씬 쉬워 질 것입니다.


는이를 위해 돼지를 고려할 수 있습니다. 그것은 "가방"으로 조금 더 나은 형태로 비정규 화 된 데이터를 처리합니다. 두 개의 서로 다른 LOAD 문 뒤에 COGROUP 연산자를 사용하여 데이터를 그룹화 한 다음 침을 뱉어 낼 수 있습니다. 귀하의 입력 데이터 형식은 돼지에게도 성가 시게됩니다.