2013-12-10 3 views
3

::.의 차이점은 pig입니까?돼지에서`::`과`.`의 차이점은 무엇입니까?

언제 내가 다른 것을 사용하나요?

A = foreach (join B by (x), C by (y)) generate B::y as b_y, C::y as c_y; 

group 필드에 액세스 할 때 내가 .이 필요합니다 :

예, 나는 필드가 모두 별명에 존재하는 경우 ::join에 필요한 것을 알고있다, 그러나

A = foreach (group B by (x,y)) generate group.x as x, group.y as y, SUM(B?z) as z; 

을 내가 통과 할 B::z 또는 B?z 대신 B.z ~ SUM?

답변

1

IIRC 일부 문의 후에 부작용으로 ::이 표시됩니다. 두 개의 서로 다른 접두사 안에 이름이 없으면 (당신이 언급 한대로) 그것에 대해 신경 쓸 필요가 없습니다.

.은 구조 내부로 들어가는 점이 다릅니다. group.x as x, group.y as yFLATTEN(group)

SUM(B?z)에 해당 - 여기 당신이 SUM에 특정 필드를 필요로 지정, SUM(B.z)을해야한다.

+1

'FLATTEN (group)'은'x'와'y'가 아닌'group :: x'와'group :: y' 필드를 만듭니다. – sds

+0

다른 'x'및/또는 'y'가 없으면 여전히 'x'또는 'y'로 참조 할 수 있다고 가정합니다. 그것이 사실이 아닌지 알려주세요. – Ruslan

+0

여러개의'group'과'join' 연산을 통해 에일 리 어스를 제공 한 후에 명시적인'group.x as x '대신'FLATTEN'을 사용하면 에러가 발생합니다. 예를 들어'A 필드가 없습니다 :: x , 단지 A :: B :: x'. – sds

5

돼지에서 ::은 명명 충돌을 일으킬 수있는 작업 후에 동음 이의 해제 도구로 사용됩니다. 특히 JOIN, CROSSFLATTEN과 같이 발생합니다. 두 가지 관계, 즉 A:{(id:int, name:chararray)}B:{(id:int, location:chararray)}을 고려하십시오. 당신은 위치와 이름을 연결하려는 경우, 자연적으로 당신이 할 것 :

C = JOIN A BY id, B BY id; 

를 동음이의 연산자없이, 스키마는

C:{(id:int, name:chararray, id:int, location:chararray)} 

지금 당신이 id가 참조하는 필드 말할 수있을 것이다. 이를 방지하려면, 돼지 대신 마찬가지로

C:{(A::id:int, A::name:chararray, B::id:int, B::location:chararray)} 

을 할 것입니다, 당신은 FLATTEN이 그 튜플 같은 이름의 필드가 가방, 또한 충돌 할 수 있습니다. 따라서 동일한 연산자가이 경우에도 사용됩니다. 그러한 충돌이없는 경우 전체 이름을 사용할 필요가 없습니다. name은 여기에서 모호하지 않습니다. C를 단순화하기 위해, 다음, 당신은이 작업을 수행 할 수 있습니다

D = FOREACH C GENERATE A::id, name, location; 

. 운영자는 대조적으로, 가방 및 튜플의 필드 프로젝트. {(x:int, y:int, z:int)} 스키마가있는 b 가방이있는 경우 프로젝션 b.y은 지정된 필드가 {(y:int)} 인 가방을 생성합니다. 괄호로 한 번에 여러 필드를 투영 할 수 있습니다. b.(y,z){(y:int, z:int)}입니다.

튜플과 함께 사용하면 결과는 지정된 필드 만있는 튜플이됩니다.t 튜플의 스키마가 (x:int, y:int, z:int) 인 경우 t.x은 튜플 (x:int)이고 t.(y,z)은 튜플 (y:int, z:int)입니다. 특정 질문에 대한 SUM으로


, 다른 요약 통계 UDF를 함께 SUM, 그 인수로 가방을 취 있습니다. 따라서 합계를 원할 때마다 하나의 필드 만있는 가방을 만들어야합니다. 투영 연산자를 사용하여 . : B.z.

관련 문제