돼지에서 ::
은 명명 충돌을 일으킬 수있는 작업 후에 동음 이의 해제 도구로 사용됩니다. 특히 JOIN
, CROSS
및 FLATTEN
과 같이 발생합니다. 두 가지 관계, 즉 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
.
'FLATTEN (group)'은'x'와'y'가 아닌'group :: x'와'group :: y' 필드를 만듭니다. – sds
다른 'x'및/또는 'y'가 없으면 여전히 'x'또는 'y'로 참조 할 수 있다고 가정합니다. 그것이 사실이 아닌지 알려주세요. – Ruslan
여러개의'group'과'join' 연산을 통해 에일 리 어스를 제공 한 후에 명시적인'group.x as x '대신'FLATTEN'을 사용하면 에러가 발생합니다. 예를 들어'A 필드가 없습니다 :: x , 단지 A :: B :: x'. – sds