2014-09-04 4 views
1

나는 돼지 작품을 사용하는 것에 비해 상대적으로 새로운입니다. 나는 id, feat1 : value, feat2 : value ... featN : 값 필드를 가진 거대한 테이블 (3.67 Mil Entries)을 가지고있다. ID 텍스트이며 feat_i이 기능의 이름과 입니다 어디에 기능 주어진 ID에 대한 전에 대한 thevalue. 특징의 수가 터프 드 표현 이후 각 튜플마다 다를 수 있습니다. 이 데이터의 3 행의 예는 예를 들어돼지 라틴어의 여러 필드에있는 튜플 필터링 및 그룹화

  1. ID1 F1 : 23 F3 : 45 F7 : 67
  2. ID2 F2 : 12 F3 : 23 개 F5 : 21
  3. 의 ID3 F7 : 30 f16 : 8 f23 : 1

이제는 일반적인 기능이있는 쿼리를 그룹화하는 작업을 수행합니다. 어떤 기능이 겹치는 쿼리 집합을 얻을 수 있어야합니다. 몇 가지 시도했습니다. CROSS 및 JOINS 데이터가 폭발적으로 생성되고 감속기가 작동하지 않습니다. GROUP BY 명령을 조절하는 것에 익숙하지 않은 Im.

공통 기능을 가진 쿼리 만 선택하도록 GROUP BY에서 조건을 작성하는 방법이 있습니까? 위의 행의 경우
이 될 것입니다 결과 :

  1. ID1, ID2
  2. ID1, ID3

감사

나는 돼지에서이 작업을 수행하는 우아한 방법을 생각할 수 없다
+0

예를 들어, id2와 id3의 공통점은 어디입니까? – Frederic

+0

죄송합니다, 당신 말이 맞습니다. 방금 대답을 수정했습니다. –

+0

PIG에는 행을 가로 질러 작업 할 수있는 조작이 없습니다. 이 경우 JOIN 또는 CROSS가 불가피합니다. 다른 해결책은 UDF를 사용하고 모든 데이터를 UDF에 단일 행으로 전달하는 것입니다. UDF에서도 JOIN (데이터에 대해 2 루프)을 수행하게 될 것이므로 UDF를 사용하면 성능이 향상되지 않습니다. IMO, 3.6M 행을 포함하는 관계의 SelfJoin은 Hadoop에서 그리 큰 것이 아닙니다. –

답변

0

. 어떤 조건에 따라 b를 그룹화 할 가능성은 없습니다.

그러나 관계를 모두 GROUP으로 설정하여 각 레코드를 다른 모든 레코드와 비교하는 UDF로 전달할 수 있습니다. 그다지 확장 성이 없으며 UDF가 필요하지만 작업을 수행합니다.

+0

이러한 모든 행 사이의 쌍 방향 유사성을 계산하는 방법이 있습니까? 다시 CROSS를 사용하면 데이터 크기가 폭발합니다 (3.6 * 3.6 밀). 난 id1, id2와 id1, id3과 id2, id3 사이의 pairwise 유사성이 필요하다. 일반적인 기능으로 필터링하여 N^2 문제를 관리 할 수 ​​있다고 생각했습니다. –

0

문자열을 구문 분석하지 않으려합니다. 가능한 경우 ID 열과 기능 열의 두 열로 데이터를 읽으십시오.

그러면 기능 테이블과 조인 할 것입니다.

f1 
f2 
f3 

Excel에서 수동으로 작성하고 HDFS에로드 : 본질적으로이처럼 보이는 테이블이 될 것입니다.

은 그럼 각 기능의 특징에 열을 기준으로하고 대한 그룹 I는 다음과 같이 본질적으로 뭔가를 모든 ID를

를 인쇄 할 것이다 :
features = load ' features.txt' using PigStorage(',') as (feature_number:chararray); 

cross_data = cross features, data; 

filtered_data = filter cross_data by (data_string_column matches feature_number); 

grouped = group filtered_data by feature_number; 

그런 다음 각 기능에 대한 모든 ID를 인쇄 할 수 있습니다.

유일한 문제는 돼지 저장 이외의 것을 사용하여 데이터를 읽는 것입니다. 그러나 이렇게하면 교차 결합이 3.6M * 3.6M에서 3.6M * (기능 수)으로 줄어 듭니다.

관련 문제