Spec-Zone.ru › Apache Pig 0.16

Встроенные функции

  • Введение
  • Динамические вызывающие методы
  • Функции Eval
    • AVG
    • BagToString
    • Bloom
    • CONCAT
    • COUNT
    • COUNT_STAR
    • DIFF
    • IsEmpty
    • MAX
    • MIN
    • PluckTuple
    • SIZE
    • SUBTRACT
    • SUM
    • TOKENIZE
  • Функции загрузки/хранения
    • Обработка сжатия
    • BinStorage
    • JsonLoader, JsonStorage
    • PigDump
    • PigStorage
    • TextLoader
    • HBaseStorage
    • AvroStorage
    • TrevniStorage
    • AccumuloStorage
    • OrcStorage
  • Математические функции
    • ABS
    • ACOS
    • ASIN
    • ATAN
    • CBRT
    • CEIL
    • COS
    • COSH
    • EXP
    • FLOOR
    • LOG
    • LOG10
    • RANDOM
    • ROUND
    • ROUND_TO
    • SIN
    • SINH
    • SQRT
    • TAN
    • TANH
  • Строковые функции
    • ENDSWITH
    • EqualsIgnoreCase
    • INDEXOF
    • LAST_INDEX_OF
    • LCFIRST
    • LOWER
    • LTRIM
    • REGEX_EXTRACT
    • REGEX_EXTRACT_ALL
    • REPLACE
    • RTRIM
    • SPRINTF
    • STARTSWITH
    • STRSPLIT
    • STRSPLITTOBAG
    • SUBSTRING
    • TRIM
    • UCFIRST
    • UPPER
    • UniqueID
  • Функции даты и времени
    • AddDuration
    • CurrentTime
    • DaysBetween
    • GetDay
    • GetHour
    • GetMilliSecond
    • GetMinute
    • GetMonth
    • GetSecond
    • GetWeek
    • GetWeekYear
    • GetYear
    • HoursBetween
    • MilliSecondsBetween
    • MinutesBetween
    • MonthsBetween
    • SecondsBetween
    • SubtractDuration
    • ToDate
    • ToMilliSeconds
    • ToString
    • ToUnixTime
    • WeeksBetween
    • YearsBetween
  • Функции кортежей, мешков, карт
    • TOTUPLE
    • TOBAG
    • TOMAP
    • TOP
  • Hive UDF
    • Синтаксис
    • Термины
    • Пример

Введение

Pig предоставляет набор встроенных функций (функций eval, загрузки/хранения, математических, строковых, функций мешков и кортежей). Два основных свойства отличают встроенные функции от пользовательских функций (UDFs). Во-первых, встроенные функции не нужно регистрировать, потому что Pig знает, где они находятся. Во-вторых, встроенные функции не нужно квалифицировать при использовании, потому что Pig знает, где их найти.

Динамические вызывающие методы

Часто вам может потребоваться использовать простую функцию, которая уже предоставляется стандартными Java-библиотеками, но для которой не была написана пользовательская функция (UDF). Динамические вызывающие методы позволяют вам ссылаться на Java-функции без необходимости их обертывания в пользовательские UDF, но с затратами на Java-рефлексию при каждом вызове функции.

...
DEFINE UrlDecode InvokeForString('java.net.URLDecoder.decode', 'String String'); 
encoded_strings = LOAD 'encoded_strings.txt' as (encoded:chararray); 
decoded_strings = FOREACH encoded_strings GENERATE UrlDecode(encoded, 'UTF-8'); 
...

В настоящее время динамические вызывающие методы могут использоваться для любой статической функции, которая:

  • Не принимает аргументы или принимает некоторые комбинации строк, целых чисел, длинных целых чисел, двойных, плавающих или массивов с этими же типами
  • Возвращает строку, целое число, длинное целое число, двойное или плавающее число

Только примитивы могут использоваться для чисел; нельзя использовать классы чисел с заглавными буквами в качестве аргументов. В зависимости от типа возвращаемого значения необходимо использовать определенный вид вызывающего метода: InvokeForString, InvokeForInt, InvokeForLong, InvokeForDouble или InvokeForFloat.

Оператор DEFINE используется для привязки ключевого слова к методу Java, как показано выше. Первый аргумент конструктора InvokeFor* — это полный путь к нужному методу. Второй аргумент — это список аргументов класса метода, разделенный пробелами. Его можно опустить или задать пустой строкой, если метод не принимает аргументов. Допустимые имена классов — string, long, float, double и int. Вызывающие методы также могут работать с аргументами массивов, представленными в Pig как DataBags элементов с одним кортежем. Например, просто укажите string[]. Имена классов не чувствительны к регистру.

Возможность использования вызывающих методов с аргументами массивов делает доступными методы из org.apache.commons.math.stat.StatUtils (например, для обработки результатов группировки наборов данных). Это полезно, но следует помнить: полученный UDF не будет оптимизирован для Hadoop, и существенные преимущества, которые обеспечивают реализация интерфейсов Algebraic и Accumulator, здесь теряются. Будьте осторожны, если вы используете вызывающие методы таким образом.

Функции Eval

СРЗНАЧ

Вычисляет среднее значение числовых значений в мешке с одним столбцом.

Синтаксис

СРЗНАЧ(выражение)

Термины

выражение

Любое выражение, результат которого — мешок. Элементы мешка должны иметь тип данных int, long, float, double, bigdecimal, biginteger или bytearray.

Использование

Используйте функцию СРЗНАЧ для вычисления среднего значения числовых значений в мешке с одним столбцом. СРЗНАЧ требует предшествующего оператора GROUP ALL для глобальных средних значений и оператора GROUP BY для средних значений по группам.

Функция СРЗНАЧ игнорирует значения NULL.

Пример

В этом примере вычисляется средняя оценка успеваемости каждого студента (см. оператор GROUP для получения информации об именах полей в отношении B).

A = LOAD 'student.txt' AS (name:chararray, term:chararray, gpa:float);

DUMP A;
(John,fl,3.9F)
(John,wt,3.7F)
(John,sp,4.0F)
(John,sm,3.8F)
(Mary,fl,3.8F)
(Mary,wt,3.9F)
(Mary,sp,4.0F)
(Mary,sm,4.0F)

B = GROUP A BY name;

DUMP B;
(John,{(John,fl,3.9F),(John,wt,3.7F),(John,sp,4.0F),(John,sm,3.8F)})
(Mary,{(Mary,fl,3.8F),(Mary,wt,3.9F),(Mary,sp,4.0F),(Mary,sm,4.0F)})

C = FOREACH B GENERATE A.name, AVG(A.gpa);

DUMP C;
({(John),(John),(John),(John)},3.850000023841858)
({(Mary),(Mary),(Mary),(Mary)},3.925000011920929)

Типы таблиц

int

long

float

double

bigdecimal

biginteger

chararray

bytearray

СРЗНАЧ

double

double

double

double

bigdecimal *

bigdecimal *

ошибка

преобразование к double

* Средние значения для типов bigdecimal и biginteger имеют настройку точности java.math.MathContext.DECIMAL128.

BagToString

Соединяет элементы мешка в строку chararray, размещая необязательный разделитель между каждым значением.

Синтаксис

BagToString(vals:bag [, delimiter:chararray])

Термины

vals

Мешок произвольных значений. Они будут преобразовываться к chararray, если это не так.

delimiter

Значение chararray, которое будет размещаться между элементами мешка; по умолчанию используется символ подчеркивания '_'.

Использование

BagToString создает одну строку из элементов мешка, аналогично функции SQL GROUP_CONCAT. Учтите следующее:

  • Мешки могут иметь произвольный размер, в то время как строки в Java не могут: вы либо исчерпаете доступную память, либо превысите максимальное количество символов (примерно 2 миллиарда). Одна из худших особенностей производственной задачи — пороговое поведение: всё будет казаться почти в порядке до тех пор, пока размер данных вашего самого большого мешка не вырастет от почти слишком большого до едва слишком большого.
  • Мешки неупорядочены, если вы не примените явную вложенную операцию ORDER BY, как показано ниже. Вложенный FOREACH сохранит порядок, позволяя вам упорядочить по одному сочетанию полей, а затем отобразить только те значения, которые вы хотите объединить.
  • Применяется стандартное преобразование в строку к каждому элементу. Если содержимое мешков не является атомами (кортеж, карта и т. д.), это может быть не то, что вам нужно. Используйте вложенный FOREACH для форматирования значений, а затем составьте их с помощью BagToString, как показано ниже

Примеры:

vals delimiter BagToString(vals, delimiter) Примечания
{('BOS'),('NYA'),('BAL')} BOS_NYA_BAL Если указан только один аргумент, поле разграничивается символами подчеркивания
{('BOS'),('NYA'),('BAL')} '|' BOS|NYA|BAL Но вы можете задать свой собственный разделитель
{('BOS'),('NYA'),('BAL')} '' BOSNYABAL Используйте явную пустую строку для сжатия всего вместе
{(1),(2),(3)} '|' 1|2|3 Элементы для вас преобразуются в соответствующие типы (но см. примеры ниже)

Примеры

Простые строки с разделителями просты:

team_parks = LOAD 'team_parks' AS (team_id:chararray, park_id:chararray, years:bag{(year_id:int)});

-- BOS     BOS07   {(1995),(1997),(1996),(1998),(1999)}
-- NYA     NYC16   {(1995),(1999),(1998),(1997),(1996)}
-- NYA     NYC17   {(1998)}
-- SDN     HON01   {(1997)}
-- SDN     MNT01   {(1996),(1999)}
-- SDN     SAN01   {(1999),(1997),(1998),(1995),(1996)}

team_parkslist = FOREACH (GROUP team_parks BY team_id) GENERATE
  group AS team_id, BagToString(team_parks.park_id, ';');

-- BOS     BOS07
-- NYA     NYC17;NYC16
-- SDN     SAN01;MNT01;HON01

Обработка сложных элементов по умолчанию работает, но, вероятно, не то, что вам нужно.

team_parkyearsugly = FOREACH (GROUP team_parks BY team_id) GENERATE
  group AS team_id,
  BagToString(team_parks.(park_id, years));

-- BOS     BOS07_{(1995),(1997),(1996),(1998),(1999)}
-- NYA     NYC17_{(1998)}_NYC16_{(1995),(1999),(1998),(1997),(1996)}
-- SDN     SAN01_{(1999),(1997),(1998),(1995),(1996)}_MNT01_{(1996),(1999)}_HON01_{(1997)}

Вместо этого собирайте его частями. В шаге 2 мы сортируем по одному полю, но обрабатываем другое; он остается в отсортированном порядке.

team_park_yearslist = FOREACH team_parks {
  years_o = ORDER years BY year_id;
  GENERATE team_id, park_id, SIZE(years_o) AS n_years, BagToString(years_o, '/') AS yearslist;
};
team_parkyearslist = FOREACH (GROUP team_park_yearslist BY team_id) {
  tpy_o = ORDER team_park_yearslist BY n_years DESC, park_id ASC;
  tpy_f = FOREACH tpy_o GENERATE CONCAT(park_id, ':', yearslist);
  GENERATE group AS team_id, BagToString(tpy_f, ';');
  };

-- BOS     BOS07:1995/1996/1997/1998/1999
-- NYA     NYC16:1995/1996/1997/1998/1999;NYC17:1998
-- SDN     SAN01:1995/1996/1997/1998/1999;MNT01:1996/1999;HON01:1997

Bloom

Bloom-фильтры — распространенный способ выбора ограниченного набора записей перед перемещением данных для соединения или других операций с высокой сложностью.

Синтаксис

BuildBloom(String hashType, String mode, String vectorSize, String nbHash)

Bloom(String filename)

Термины

hashtype

Тип функции хеширования для использования. Допустимые значения для функций хеширования — 'jenkins' и 'murmur'.

mode

Будет проигнорирован, хотя по соглашению он должен быть "fixed" или "fixedsize"

vectorSize

Количество бит в Bloom-фильтре.

nbHash

Количество функций хеширования, используемых при построении Bloom-фильтра.

filename

Файл, содержащий сериализованный Bloom-фильтр.

См. Bloom Filter для обсуждения выбора количества бит и количества функций хеширования.

Использование

Bloom-фильтры — распространенный способ выбора ограниченного набора записей перед перемещением данных для соединения или других операций с высокой сложностью. Например, если нужно соединить очень большой набор данных L с меньшим набором S, и известно, что количество ключей в L, которые будут совпадать с S, невелико, создание Bloom-фильтра на S и его применение к L перед соединением может значительно уменьшить количество записей из L, которые нужно переместить из карты в редуцирование, ускорив тем самым соединение.

Реализация использует внутренне Bloom-фильтры Hadoop (org.apache.hadoop.util.bloom.BloomFilter).

Примеры

  define bb BuildBloom('128', '3', 'jenkins');
  small = load 'S' as (x, y, z);
  grpd = group small all;
  fltrd = foreach grpd generate bb(small.x);
  store fltrd in 'mybloom';
  exec;
  define bloom Bloom('mybloom');
  large = load 'L' as (a, b, c);
  flarge = filter large by bloom(L.a);
  joined = join small by x, flarge by a;
  store joined into 'results';

CONCAT

Объединяет два или более выражений одного и того же типа.

Синтаксис

CONCAT (выражение, выражение, [...выражение])

Термины

выражение

Любое выражение.

Использование

Используйте функцию CONCAT для объединения двух или более выражений. Результаты выражений должны иметь одинаковые типы.

Если какое-либо подвыражение равно null, результирующее выражение также равно null.

Пример

В этом примере поля f1, строковая подстановка подчеркивания, f2 и f3 объединяются.

A = LOAD 'data' as (f1:chararray, f2:chararray, f3:chararray);

DUMP A;
(apache,open,source)
(hadoop,map,reduce)
(pig,pig,latin)

X = FOREACH A GENERATE CONCAT(f1, '_', f2,f3);

DUMP X;
(apache_opensource)
(hadoop_mapreduce)
(pig_piglatin)

COUNT

Вычисляет количество элементов в мешке.

Синтаксис

COUNT(выражение)

Термины

выражение

Выражение с типом данных мешок.

Использование

Используйте функцию COUNT для вычисления количества элементов в мешке. COUNT требует предшествующего оператора GROUP ALL для глобальных подсчётов и оператора GROUP BY для подсчётов по группам.

Функция COUNT следует синтаксическим правилам и игнорирует null. Это означает, что кортеж в мешке не будет учтён, если ПЕРВОЕ ПОЛЕ этого кортежа равно NULL. Если вы хотите включить значения NULL в вычисление подсчёта, используйте COUNT_STAR.

Примечание: вы не можете использовать указатель кортежа (*) с COUNT; то есть COUNT(*) не сработает.

Пример

В этом примере подсчитываются кортежи в мешке (см. оператор GROUP для получения информации об именах полей в отношении B).

A = LOAD 'data' AS (f1:int,f2:int,f3:int);

DUMP A;
(1,2,3)
(4,2,1)
(8,3,4)
(4,3,3)
(7,2,5)
(8,4,3)

B = GROUP A BY f1;

DUMP B;
(1,{(1,2,3)})
(4,{(4,2,1),(4,3,3)})
(7,{(7,2,5)})
(8,{(8,3,4),(8,4,3)})

X = FOREACH B GENERATE COUNT(A);

DUMP X;
(1L)
(2L)
(1L)
(2L)

Типы таблиц

int

long

float

double

chararray

bytearray

COUNT

long

long

long

long

long

long

COUNT_STAR

Вычисляет количество элементов в мешке.

Синтаксис

COUNT_STAR(выражение)

Термины

выражение

Выражение с типом данных мешок.

Использование

Используйте функцию COUNT_STAR для вычисления количества элементов в мешке. COUNT_STAR требует предшествующего оператора GROUP ALL для глобальных подсчётов и оператора GROUP BY для подсчётов по группам.

COUNT_STAR включает нулевые значения в вычислении подсчёта (в отличие от COUNT, который игнорирует нулевые значения).

Пример

В этом примере COUNT_STAR используется для подсчёта кортежей в множестве.

X = FOREACH B GENERATE COUNT_STAR(A);

DIFF

Сравнивает два поля в кортеже.

Синтаксис

DIFF (выражение, выражение)

Термины

выражение

Выражение с любым типом данных.

Использование

Функция DIFF принимает два множества в качестве аргументов и сравнивает их. Любые кортежи, которые находятся в одном множестве, но не в другом, возвращаются в множестве. Если множества совпадают, возвращается пустое множество. Если поля не являются множествами, то они будут заключены в кортежи и возвращены в множестве, если они не совпадают, или возвращается пустое множество, если два запися совпадают. Реализация предполагает, что оба множества, передаваемые функции DIFF, полностью помещаются в память одновременно. Если это не так, UDF всё равно будет работать, но очень медленно.

Пример

В этом примере DIFF сравнивает кортежи в двух множествах.

A = LOAD 'bag_data' AS (B1:bag{T1:tuple(t1:int,t2:int)},B2:bag{T2:tuple(f1:int,f2:int)});

DUMP A;
({(8,9),(0,1)},{(8,9),(1,1)})
({(2,3),(4,5)},{(2,3),(4,5)})
({(6,7),(3,7)},{(2,2),(3,7)})

DESCRIBE A;
a: {B1: {T1: (t1: int,t2: int)},B2: {T2: (f1: int,f2: int)}}

X = FOREACH A GENERATE DIFF(B1,B2);

grunt> dump x;
({(0,1),(1,1)})
({})
({(6,7),(2,2)})

IsEmpty

Проверяет, пусто ли множество или карта.

Синтаксис

IsEmpty(выражение)

Термины

выражение

Выражение с любым типом данных.

Использование

Функция IsEmpty проверяет, пусто ли множество или карта (не содержит данных). Функция может использоваться для фильтрации данных.

Пример

В этом примере определяются все студенты с SSN, но без имени.

SSN = load 'ssn.txt' using PigStorage() as (ssn:long);

SSN_NAME = load 'students.txt' using PigStorage() as (ssn:long, name:chararray);

/* do a cogroup of SSN with SSN_Name */
X = COGROUP SSN by ssn, SSN_NAME by ssn;

/* only keep those ssn's for which there is no name */
Y = filter X by IsEmpty(SSN_NAME);

MAX

Вычисляет максимальное значение числовых значений или chararray в множестве с одним столбцом. MAX требует предшествующей инструкции GROUP ALL для глобальных максимумов и инструкции GROUP BY для групповых максимумов.

Синтаксис

MAX(выражение)

Термины

выражение

Выражение с типами данных int, long, float, double, bigdecimal, biginteger, chararray, datetime или bytearray.

Использование

Используйте функцию MAX для вычисления максимального значения числовых значений или chararray в множестве с одним столбцом.

Функция MAX игнорирует нулевые значения.

Пример

В этом примере вычисляется максимальная оценка GPA для всех семестров для каждого студента (см. оператор GROUP для получения информации о названиях полей в отношении B).

A = LOAD 'student' AS (name:chararray, session:chararray, gpa:float);

DUMP A;
(John,fl,3.9F)
(John,wt,3.7F)
(John,sp,4.0F)
(John,sm,3.8F)
(Mary,fl,3.8F)
(Mary,wt,3.9F)
(Mary,sp,4.0F)
(Mary,sm,4.0F)

B = GROUP A BY name;

DUMP B;
(John,{(John,fl,3.9F),(John,wt,3.7F),(John,sp,4.0F),(John,sm,3.8F)})
(Mary,{(Mary,fl,3.8F),(Mary,wt,3.9F),(Mary,sp,4.0F),(Mary,sm,4.0F)})

X = FOREACH B GENERATE group, MAX(A.gpa);

DUMP X;
(John,4.0F)
(Mary,4.0F)

Типы таблиц

int

long

float

double

bigdecimal

biginteger

chararray

datetime

bytearray

MAX

int

long

float

double

bigdecimal

biginteger

chararray

datetime

преобразовано к double

MIN

Вычисляет минимальное значение числовых значений или chararray в множестве с одним столбцом. MIN требует предшествующей инструкции GROUP… ALL для глобальных минимумов и инструкции GROUP … BY для групповых минимумов.

Синтаксис

MIN(выражение)

Термины

выражение

Выражение с типами данных int, long, float, double, bigdecimal, biginteger, chararray, datetime или bytearray.

Использование

Используйте функцию MIN для вычисления минимального значения набора числовых значений или chararray в множестве с одним столбцом.

Функция MIN игнорирует нулевые значения.

Пример

В этом примере вычисляется минимальная оценка GPA для всех семестров для каждого студента (см. оператор GROUP для получения информации о названиях полей в отношении B).

A = LOAD 'student' AS (name:chararray, session:chararray, gpa:float);

DUMP A;
(John,fl,3.9F)
(John,wt,3.7F)
(John,sp,4.0F)
(John,sm,3.8F)
(Mary,fl,3.8F)
(Mary,wt,3.9F)
(Mary,sp,4.0F)
(Mary,sm,4.0F)

B = GROUP A BY name;

DUMP B;
(John,{(John,fl,3.9F),(John,wt,3.7F),(John,sp,4.0F),(John,sm,3.8F)})
(Mary,{(Mary,fl,3.8F),(Mary,wt,3.9F),(Mary,sp,4.0F),(Mary,sm,4.0F)})

X = FOREACH B GENERATE group, MIN(A.gpa);

DUMP X;
(John,3.7F)
(Mary,3.8F)

Типы таблиц

int

long

float

double

bigdecimal

biginteger

chararray

datetime

bytearray

MIN

int

long

float

double

bigdecimal

biginteger

chararray

datetime

преобразовано к double

PluckTuple

Позволяет пользователю указать префикс строки, а затем отфильтровать столбцы в отношении, которые начинаются с этого префикса или соответствуют этому шаблону регулярных выражений. При необходимости, включите флаг 'false', чтобы отфильтровать столбцы, которые не соответствуют этому префиксу или не соответствуют шаблону регулярных выражений.

Синтаксис

DEFINE pluck PluckTuple(выражение1)

DEFINE pluck PluckTuple(выражение1,выражение3)

pluck(выражение2)

Термины

выражение1

Префикс для извлечения или шаблон регулярных выражений для извлечения

выражение2

Поля, к которым применять pluck, обычно '*'

выражение3

Логический флаг, указывающий, следует ли включать или исключать соответствующие столбцы

Использование

Пример:

a = load 'a' as (x, y);
b = load 'b' as (x, y);
c = join a by x, b by x;
DEFINE pluck PluckTuple('a::');
d = foreach c generate FLATTEN(pluck(*));
describe c;
c: {a::x: bytearray,a::y: bytearray,b::x: bytearray,b::y: bytearray}
describe d;
d: {plucked::a::x: bytearray,plucked::a::y: bytearray}
DEFINE pluckNegative PluckTuple('a::','false');
d = foreach c generate FLATTEN(pluckNegative(*));
describe d;
d: {plucked::b::x: bytearray,plucked::b::y: bytearray}

SIZE

Вычисляет количество элементов на основе любого типа данных Pig.

Синтаксис

SIZE(выражение)

Термины

выражение

Выражение с любым типом данных.

Использование

Используйте функцию SIZE для вычисления количества элементов на основе типа данных (см. таблицы типов ниже). SIZE включает нулевые значения в вычислении размера. SIZE не является алгебраической.

Если тестируемый объект равен null, функция SIZE возвращает null.

Пример

В этом примере вычисляется количество символов в первом поле.

A = LOAD 'data' as (f1:chararray, f2:chararray, f3:chararray);
(apache,open,source)
(hadoop,map,reduce)
(pig,pig,latin)

X = FOREACH A GENERATE SIZE(f1);

DUMP X;
(6L)
(6L)
(3L)

Типы таблиц

int

возвращает 1

long

возвращает 1

float

возвращает 1

double

возвращает 1

chararray

возвращает количество символов в массиве

bytearray

возвращает количество байтов в массиве

tuple

возвращает количество полей в кортеже

bag

возвращает количество кортежей в множестве

map

возвращает количество пар ключ/значение в карте

SUBTRACT

Вычитание множеств, SUBTRACT(множество1, множество2) = множества, составленные из элементов множества1, отсутствующих в множестве2

Синтаксис

SUBTRACT(выражение, выражение)

Термины

выражение

Выражение с типом данных множество.

Использование

SUBTRACT принимает два множества в качестве аргументов и возвращает новое множество, состоящее из кортежей первого множества, которые отсутствуют во втором множестве.

Если null, аргументы множеств заменяются пустыми множествами.
Если аргументы не являются множествами, выбрасывается исключение IOException.

Реализация предполагает, что оба множества, передаваемые функции SUBTRACT, полностью помещаются в память одновременно, если это не так, SUBTRACT всё равно будет работать, но очень медленно.

Пример

В этом примере SUBTRACT создаёт новое множество, составленное из элементов B1, которые отсутствуют в B2.

A = LOAD 'bag_data' AS (B1:bag{T1:tuple(t1:int,t2:int)},B2:bag{T2:tuple(f1:int,f2:int)});

DUMP A;
({(8,9),(0,1),(1,2)},{(8,9),(1,1)})
({(2,3),(4,5)},{(2,3),(4,5)})
({(6,7),(3,7),(3,7)},{(2,2),(3,7)})

DESCRIBE A;
A: {B1: {T1: (t1: int,t2: int)},B2: {T2: (f1: int,f2: int)}}

X = FOREACH A GENERATE SUBTRACT(B1,B2);

DUMP X;
({(0,1),(1,2)})
({})
({(6,7)})

SUM

Вычисляет сумму числовых значений в множестве с одним столбцом. SUM требует предшествующей инструкции GROUP ALL для глобальных сумм и инструкции GROUP BY для групповых сумм.

Синтаксис

SUM(выражение)

Термины

выражение

Выражение с типами данных int, long, float, double, bigdecimal, biginteger или bytearray, преобразованных к double.

Использование

Используйте функцию SUM для вычисления суммы набора числовых значений в множестве с одним столбцом.

Функция SUM игнорирует нулевые значения.

Пример

В этом примере вычисляется количество домашних животных. (см. оператор GROUP для получения информации о названиях полей в отношении B).

A = LOAD 'data' AS (owner:chararray, pet_type:chararray, pet_num:int);

DUMP A;
(Alice,turtle,1)
(Alice,goldfish,5)
(Alice,cat,2)
(Bob,dog,2)
(Bob,cat,2) 

B = GROUP A BY owner;

DUMP B;
(Alice,{(Alice,turtle,1),(Alice,goldfish,5),(Alice,cat,2)})
(Bob,{(Bob,dog,2),(Bob,cat,2)})

X = FOREACH B GENERATE group, SUM(A.pet_num);
DUMP X;
(Alice,8L)
(Bob,4L)

Типы таблиц

int

long

float

double

bigdecimal

biginteger

chararray

bytearray

SUM

long

long

double

double

bigdecimal

biginteger

ошибка

преобразование в double

TOKENIZE

Разделяет строку и выводит набор слов.

Синтаксис

TOKENIZE(выражение [, 'разделитель_полей'])

Термины

выражение

Выражение с типом данных chararray.

'разделитель_полей'

Необязательный разделитель полей (в одинарных кавычках).

Если разделитель_полей имеет значение NULL или не передан, в качестве разделителей будут использоваться: пробел [ ], двойная кавычка [ " ], запятая [ , ], скобки [ () ], звездочка [ * ].

Использование

Используйте функцию TOKENIZE для разделения строки слов (все слова в одном кортеже) на набор слов (каждое слово в отдельном кортеже).

Пример

В этом примере строки в каждой строке разделены.

A  = LOAD 'data' AS (f1:chararray);

DUMP A;
(Here is the first string.)
(Here is the second string.)
(Here is the third string.)

X = FOREACH A GENERATE TOKENIZE(f1);

DUMP X;
({(Here),(is),(the),(first),(string.)})
({(Here),(is),(the),(second),(string.)})
({(Here),(is),(the),(third),(string.)})

В этом примере задан разделитель полей.

{code}
A = LOAD 'data' AS (f1:chararray);
B = FOREACH A TOKENIZE (f1,'||');
DUMP B;
{code} 

Функции загрузки/хранения

Функции загрузки/сохранения определяют, как данные попадают в Pig и выводятся из Pig. Pig предоставляет набор встроенных функций загрузки/сохранения, описанных в разделах ниже. Вы также можете написать свои собственные функции загрузки/сохранения (см. Пользовательские функции).

Обработка сжатия

Поддержка сжатия определяется функцией загрузки/сохранения. PigStorage и TextLoader поддерживают gzip и bzip сжатие как для чтения (загрузки), так и для записи (сохранения). BinStorage не поддерживает сжатие.

Для работы со сжатыми gzip файлами входные/выходные файлы должны иметь расширение .gz. Сжатые gzip файлы не могут быть разделены между несколькими картами; это означает, что количество созданных карт равно количеству файлов-частей в расположении входных данных.

A = load 'myinput.gz';
store A into 'myoutput.gz';

Для работы со сжатыми bzip файлами входные/выходные файлы должны иметь расширение .bz или .bz2. Поскольку сжатие ориентировано на блоки, файлы bzip могут быть разделены между несколькими картами.

A = load 'myinput.bz';
store A into 'myoutput.bz';

Примечание: PigStorage и TextLoader правильно читают сжатые файлы, если они НЕ являются склеенными bz/bz2 файлами, сгенерированными таким образом:

  • cat *.bz > text/concat.bz

  • cat *.bz2 > text/concat.bz2

Если вы используете склеенные bzip файлы со своими заданиями Pig, вы не увидите ошибки, но результаты будут НЕКОРРЕКТНЫМИ.

BinStorage

Загружает и сохраняет данные в машиночитаемом формате.

Синтаксис

BinStorage()

Термины

нет

нет параметров

Использование

Pig использует BinStorage для загрузки и сохранения временных данных, генерируемых между несколькими заданиями MapReduce.

  • BinStorage работает с данными, представленными на диске в машиночитаемом формате. BinStorage НЕ поддерживает сжатие.
  • BinStorage поддерживает несколько расположений (файлы, каталоги, шаблоны) в качестве входных данных.

Иногда пользователи используют BinStorage для сохранения собственных данных. Однако, поскольку BinStorage является собственным бинарным форматом, исходные данные никогда не находятся в BinStorage - это всегда производная от каких-либо других данных.

Мы видели несколько примеров, когда пользователи делали что-то вроде этого:

a = load 'b.txt' as (id, f);
b = group a by id;
store b into 'g' using BinStorage();

И затем позже:

a = load 'g/part*' using BinStorage() as (id, d:bag{t:(v, s)});
b = foreach a generate (double)id, flatten(d);
dump b;

В этой последовательности действий есть проблема. Первый скрипт не определяет типы данных и, как следствие, данные хранятся как массив байтов и пакет с кортежем, содержащим два массива байтов. Второй скрипт пытается преобразовать массив байтов в двойное значение; однако, поскольку данные были получены из другого загрузчика, у него нет возможности узнать формат массива байтов или как преобразовать его в другой тип. Чтобы решить эту проблему, Pig:

  • Выводит сообщение об ошибке при выполнении второго скрипта: "ERROR 1118: Невозможно преобразовать байты, загруженные из BinStorage. Пожалуйста, укажите пользовательский преобразователь."
  • Разрешает использование пользовательского преобразователя для выполнения преобразования.
    a = load 'g/part*' using BinStorage('Utf8StorageConverter') as (id, d:bag{t:(v, s)});
    b = foreach a generate (double)id, flatten(d);
    dump b;
    

Примеры

В этом примере BinStorage используется с функциями LOAD и STORE.

A = LOAD 'data' USING BinStorage();

STORE X into 'output' USING BinStorage(); 

В этом примере BinStorage используется для загрузки нескольких расположений.

A = LOAD 'input1.bin, input2.bin' USING BinStorage();

BinStorage не отслеживает происхождение данных. Когда Pig использует BinStorage для перемещения данных между заданиями MapReduce, Pig может определить правильную функцию преобразования и применить ее. Однако, как показано в примере ниже, когда вы сохраняете данные с помощью BinStorage, а затем используете отдельный скрипт Pig Latin для чтения данных (тем самым теряя информацию о типе), вы несете ответственность за правильное преобразование данных перед сохранением их с помощью BinStorage.

raw = load 'sampledata' using BinStorage() as (col1,col2, col3);
--filter out null columns
A = filter raw by col1#'bcookie' is not null;

B = foreach A generate col1#'bcookie'  as reqcolumn;
describe B;
--B: {regcolumn: bytearray}
X = limit B 5;
dump X;
(36co9b55onr8s)
(36co9b55onr8s)
(36hilul5oo1q1)
(36hilul5oo1q1)
(36l4cj15ooa8a)

B = foreach A generate (chararray)col1#'bcookie'  as convertedcol;
describe B;
--B: {convertedcol: chararray}
X = limit B 5;
dump X; 
()
()
()
()
()

JsonLoader, JsonStorage

Загрузка или сохранение данных JSON.

Синтаксис

JsonLoader( ['схема'] )

JsonStorage( )

Термины

схема

Необязательная схема Pig, в одинарных кавычках.

Использование

Используйте JsonLoader для загрузки данных JSON.

Используйте JsonStorage для сохранения данных JSON.

Обратите внимание, что понятия разделителей нет в JsonLoader или JsonStorage. Данные закодированы в стандартном формате JSON. JsonLoader необязательно принимает схему в качестве аргумента конструкции.

Примеры

В этом примере данные загружаются со схемой.

a = load 'a.json' using JsonLoader('a0:int,a1:{(a10:int,a11:chararray)},a2:(a20:double,a21:bytearray),a3:[chararray]');  

В этом примере данные загружаются без схемы; предполагается, что в каталоге ввода есть .pig_schema (произведенный JsonStorage).

a = load 'a.json' using JsonLoader(); 

PigDump

Сохраняет данные в формате UTF-8.

Синтаксис

PigDump()

Термины

нет

нет параметров

Использование

PigDump сохраняет данные как кортежи в удобочитаемом формате UTF-8.

Пример

В этом примере PigDump используется с функцией STORE.

STORE X INTO 'output' USING PigDump();

PigStorage

Загружает и сохраняет данные как структурированные текстовые файлы.

Синтаксис

PigStorage( [разделитель_полей] , ['опции'] )

Термины

разделитель_полей

По умолчанию разделитель полей – табуляция ('\t').

Вы можете указать другие символы в качестве разделителей полей; однако, обязательно заключите символы в одинарные кавычки.

'опции'

Строка, содержащая разделенные пробелами опции ('опцияA опцияB опцияC')

В настоящее время поддерживаются следующие опции:

  • ('схема') - Сохраняет схему отношения с помощью скрытого JSON-файла.
  • ('noschema') - Игнорирует сохраненную схему во время загрузки.
  • ('tagsource') - (устаревшее, используйте tagPath вместо этого) Добавляет первый столбец, указывающий входной файл записи.
  • ('tagPath') - Добавляет первый столбец, указывающий путь к входному файлу записи.
  • ('tagFile') - Добавляет первый столбец, указывающий имя входного файла записи.

Использование

PigStorage – это функция по умолчанию, используемая Pig для загрузки/сохранения данных. PigStorage поддерживает структурированные текстовые файлы (в удобочитаемом формате UTF-8) в сжатом или несжатом виде (см. Обработку сжатия). Все типы данных Pig (типы данных) (простые и сложные) могут быть загружены/сохранены с помощью этой функции. Входные данные для загрузки могут быть файлом, каталогом или шаблоном.

Заявления LOAD/STORE

Заявления LOAD – PigStorage ожидает, что данные будут отформатированы с использованием разделителей полей, либо символа табуляции ('\t'), либо другого указанного символа.

Заявления STORE – PigStorage выводит данные с использованием разделителей полей, либо символа табуляции ('\t'), либо другого указанного символа, и разделителя записей новой строки ('\n').

Разделители полей/записей

Разделители полей – для заявлений LOAD и STORE по умолчанию используется символ табуляции ('\t'). Вы можете использовать другие символы в качестве разделителей полей, но разделители, такие как ^A или Ctrl-A, должны быть представлены в Unicode (\u0001) с использованием кодировки UTF-16 (см. Википедию ASCII, Unicode и UTF-16).

Разделители записей – для заявлений LOAD Pig интерпретирует символы новой строки ('\n'), возврата каретки ('\r' или CTRL-M) и сочетания CR + LF ('\r\n') как разделители записей (не используйте эти символы как разделители полей). Для заявлений STORE Pig использует символ новой строки ('\n') как разделитель записей.

Схемы

Если опция схемы указана, скрытый файл ".pig_schema" создается в выходном каталоге при сохранении данных. Он используется PigStorage (с опцией -схема или без нее) при загрузке для определения имен и типов полей данных без необходимости явного указания схемы пользователем в операторе as, если не указана опция noschema. Попыток объединения конфликтующих схем при загрузке не делается. Используется первая схема, встреченная при сканировании файловой системы.

Кроме того, если указана опция схемы, в выходном каталоге создается файл ".pig_headers". Этот файл просто перечисляет алиасы разделителей. Это призвано облегчить экспорт в инструменты, которые могут читать файлы с заголовками (просто добавьте заголовок к вашим данным).

Если опция схемы НЕ указана, схема не будет записана при сохранении данных.

Если опция noschema НЕ указана, а схема найдена, она загружается при загрузке данных.

Обратите внимание, что независимо от того, сохраняете ли вы схему, вам всегда необходимо указать правильный разделитель для чтения ваших данных. Если вы сохраняете с разделителем "#" и затем загружаете с разделителем по умолчанию, ваши данные не будут правильно обработаны.

Происхождение записей

Если указана опция tagPath или tagFile, PigStorage добавит псевдостолбец INPUT_FILE_PATH или INPUT_FILE_NAME соответственно в начало записи. Как следует из названия, это путь/имя входного файла, содержащего эту конкретную запись. Обратите внимание, что tagsource устарел.

Сложные типы данных

Форматы сложных типов данных показаны здесь:

  • Кортеж: заключен в (), элементы разделены запятыми
    • Непустой кортеж: (элемент1,элемент2,элемент3)
    • Пустой кортеж допустим: ()
  • Пакет: заключен в {}, кортежи разделены запятыми
    • Непустой пакет: {код}{(кортеж1),(кортеж2),(кортеж3)}{код}
    • Пустой пакет допустим: {}
  • Словарь: заключен в [], элементы разделены запятыми, ключ и значение разделены "#"
    • Непустой словарь: [ключ1#значение1,ключ2#значение2]
    • Пустой словарь допустим: []

Если в операторе LOAD указана схема, Pig преобразует сложный тип в соответствии со схемой. Если преобразование завершается неудачей, затронутый элемент будет нулевым (см. Нули и Pig Latin).

Примеры

В этом примере PigStorage ожидает, что input.txt будет содержать поля, разделенные табуляцией, и записи, разделенные символом новой строки. Заявления эквивалентны.

A = LOAD 'student' USING PigStorage('\t') AS (name: chararray, age:int, gpa: float); 

A = LOAD 'student' AS (name: chararray, age:int, gpa: float);

В этом примере PigStorage сохраняет содержимое X в файлы с полями, разделенными звездочкой (*). Оператор STORE указывает, что файлы будут находиться в каталоге с именем output и что файлы будут иметь имена part-nnnnn (например, part-00000).

STORE X INTO  'output' USING PigStorage('*');

В этом примере PigStorage загружает данные со сложным типом данных, пакетом из словаря и двойного значения.

a = load '1.txt' as (a0:{t:(m:map[int],d:double)});

{([foo#1,bar#2],34.0),([white#3,yellow#4],45.0)} : valid
{([foo#badint],baddouble)} : conversion fail for badint/baddouble, get {([foo#],)}
{} : valid, empty bag

TextLoader

Загружает неструктурированные данные в формате UTF-8.

Синтаксис

TextLoader()

Термины

нет

без параметров

Использование

TextLoader работает с неструктурированными данными в формате UTF8. Каждая полученная кортеж содержит одно поле с одной строкой входного текста. TextLoader также поддерживает сжатие.

В настоящее время поддержка сжатия в TextLoader ограничена.

TextLoader не может использоваться для хранения данных.

Пример

В этом примере TextLoader используется с функцией LOAD.

A = LOAD 'data' USING TextLoader();

HBaseStorage

Загружает и сохраняет данные из таблицы HBase.

Синтаксис

HBaseStorage('columns', ['options'])

Термины

columns

Список квалифицированных столбцов HBase для чтения или записи данных. Имя семейства столбцов и квалификатор столбца разделены двоеточием (:). Необходимо указать только столбцы, используемые в скрипте Pig. Столбцы указываются одним из трех способов, описанных ниже.

  • Явно указать семейство и квалификатор столбца (например, user_info:id). Это приведет к скаляру в результирующей кортеже.
  • Указать семейство столбцов и часть имени квалификатора столбца в качестве префикса, за которым следует звездочка (например, user_info:address_*). Этот подход используется для чтения одного или нескольких столбцов из одного семейства столбцов с соответствующим префиксом описателя. Тип данных для этого поля будет отображением имени описателя столбца к значению поля. Обратите внимание, что сочетание этого стиля префикса с длинным списком полностью квалифицированных имен описателей столбцов может привести к снижению производительности при сканировании HBase. Это приведет к отображению Pig в результирующей кортеже с описателями столбцов в качестве ключей.
  • Указать все столбцы семейства столбцов, используя имя семейства столбцов, за которым следует звездочка (например, user_info:*). Это приведет к отображению Pig в результирующей кортеже с описателями столбцов в качестве ключей.

'options'

Строка, содержащая параметры, разделенные пробелами (‘-optionA=valueA -optionB=valueB -optionC=valueC’)

В настоящее время поддерживаются следующие параметры:

  • -loadKey=(true|false) Загрузить ключ строки в качестве первого значения в каждой кортеже, возвращаемой из HBase (по умолчанию=false)
  • -gt=minKeyVal Возвратить строки с ключом строки, большим minKeyVal
  • -lt=maxKeyVal Возвратить строки с ключом строки, меньшим maxKeyVal
  • -regex=regex Возвратить строки с ключом строки, соответствующим этому регулярному выражению в KeyVal
  • -gte=minKeyVal Возвратить строки с ключом строки, большим или равным minKeyVal
  • -lte=maxKeyVal Возвратить строки с ключом строки, меньшим или равным maxKeyVal
  • -limit=numRowsPerRegion Максимальное количество строк для извлечения на регион
  • -caching=numRows Количество строк для кэширования (более быстрые сканирования, больше памяти)
  • -delim=разделитель Разделитель столбцов в списке столбцов (по умолчанию — пробел)
  • -ignoreWhitespace=(true|false) Если разделитель не равен пробелу, игнорировать пробелы при разборе списка столбцов (по умолчанию=true)
  • -caster=(HBaseBinaryConverter|Utf8StorageConverter) Имя класса преобразователя для преобразования значений (по умолчанию=Utf8StorageConverter). По умолчанию преобразователь может быть переопределён параметром конфигурации pig.hbase.caster. Преобразователи должны реализовывать LoadStoreCaster.
  • -noWAL=(true|false) Во время хранения установить запись вперёд в false для более быстрого загрузки в HBase (по умолчанию=false). Используйте с большой осторожностью, так как это может привести к потере данных (см. http://hbase.apache.org/book.html#perf.hbase.client.putwal).
  • -minTimestamp=timestamp Возвратить значения ячеек, которые имеют временную метку создания, большую или равную этому значению
  • -maxTimestamp=timestamp Возвратить значения ячеек, которые имеют временную метку создания, меньшую чем это значение
  • -timestamp=timestamp Возвратить значения ячеек, которые имеют временную метку создания, равную этому значению
  • -includeTimestamp=Запись будет включать временную метку после ключа строки при сохранении (ключ строки, временная метка, ...)
  • -includeTombstone=Запись будет включать метку маркера tombstone после ключа строки и временной метки (если включена) (ключ строки, [временная метка,] tombstone, ...)

Использование

HBaseStorage сохраняет и загружает данные из HBase. Функция принимает два аргумента. Первый аргумент — это список столбцов, разделённых пробелами. Второй необязательный аргумент — это список параметров, разделённых пробелами. Синтаксис столбцов и доступные параметры перечислены выше. Обратите внимание, что HBaseStorage всегда отключает сочетание split.

Пример загрузки

В этом примере HBaseStorage используется с функцией LOAD с явным схемой.

raw = LOAD 'hbase://SomeTableName'
      USING org.apache.pig.backend.hadoop.hbase.HBaseStorage(
      'info:first_name info:last_name tags:work_* info:*', '-loadKey=true -limit=5') AS
      (id:bytearray, first_name:chararray, last_name:chararray, tags_map:map[], info_map:map[]);

Типы данных столбцов объявляются с помощью «AS». Столбцы first_name и last_name задаются в виде полных имён столбцов с типом chararray. Третья спецификация тегов:work_* запрашивает набор столбцов в семействе столбцов тегов, начинающихся с "work_". В таблице HBase может быть ноль, один или несколько столбцов такого типа. Тип задаётся как tags_map:map[]. Это указывает, что набор возвращаемых значений столбцов будет доступен как отображение, где ключ — это имя столбца, а значение — это значение ячейки столбца. Четвёртое указание столбца также является отображением описателей столбцов к значениям ячеек.

Когда тип столбца задаётся как отображение в разделе «AS», ключами отображения являются имена описателей столбцов, а тип данных — chararray. Тип данных значений столбцов может быть явно объявлен, как показано в примерах ниже:

  • tags_map[chararray] — В этом случае все значения столбцов объявляются как типа chararray
  • tags_map[int] — В этом случае все значения столбцов объявляются как типа int.

Пример сохранения

В этом примере HBaseStorage используется для сохранения отношения в HBase.

A = LOAD 'hdfs_users' AS (id:bytearray, first_name:chararray, last_name:chararray);
STORE A INTO 'hbase://users_table' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage(
    'info:first_name info:last_name');

В примере выше отношение A загружается из HDFS и сохраняется в HBase. Обратите внимание, что схема отношения A является кортежем размером 3, но в конструктор HBaseStorage передаются только два имени описателей столбцов. Это связано с тем, что первое значение в кортеже используется в качестве ключа строки HBase.

AvroStorage

Загружает и сохраняет данные из файлов Avro.

Синтаксис

AvroStorage(['schema|record name'], ['options'])

Термины

схема

Строка JSON, определяющая схему Avro для ввода. Вы можете указать явную схему при сохранении данных или при загрузке данных. При ручном предоставлении схемы Pig будет использовать предоставленную схему для сериализации и десериализации. Это означает, что вы можете предоставить явную схему при сохранении данных, чтобы упростить вывод (например, удалив nullable unions) или переименовать поля. Это также означает, что вы можете предоставить явную схему при чтении данных, чтобы прочитать только подмножество полей в каждом записях.

См. документацию Apache Avro для получения дополнительной информации о том, как указать допустимую схему.

имя записи

При сохранении мешка кортежей с помощью AvroStorage, если вы не хотите указывать полную схему, вы можете указать имя записи Avro вместо этого. (AvroStorage определит, что аргумент не является допустимым определением схемы, и использует его как имя переменной вместо этого.)

'options'

Строка, содержащая параметры, разделенные пробелами (‘-optionA valueA -optionB valueB -optionC ’)

В настоящее время поддерживаются следующие параметры:

  • -namespace nameSpace или -n nameSpace Явно указать поле пространства имен в записях Avro при сохранении данных
  • -schemfile schemaFile или -f schemaFile Указать схему ввода (или вывода) из внешнего файла. Pig предполагает, что файл находится в файловой системе по умолчанию, но вы можете использовать явный URL для явного указания местоположения. (Например, если данные находятся в вашей локальной файловой системе в /stuff/schemafile.avsc, вы можете указать "-f file:///stuff/schemafile.avsc" для указания местоположения. Если данные находятся в HDFS под /yourdirectory/schemafile.avsc, вы можете указать "-f hdfs:///yourdirectory/schemafile.avsc"). Pig ожидает, что это текстовый файл, содержащий допустимую схему avro.
  • -examplefile exampleFile или -e exampleFile Указать схему ввода (или вывода) с помощью другого файла Avro в качестве примера. Pig предполагает, что файл находится в файловой системе по умолчанию, но вы можете использовать явный URL для указания местоположения. Pig ожидает, что это файл данных Avro.
  • -allowrecursive или -r Указать, разрешить ли рекурсивные определения схем (по умолчанию — выбросить исключение, если Pig обнаружит рекурсивную схему). При чтении объектов с рекурсивными определениями Pig будет преобразовывать записи Avro в кортежи без схемы; схема Pig для объекта может не соответствовать данным точно.
  • -doublecolons или -d Указать, как обрабатывать схемы Pig, содержащие двойные двоеточия, при записи данных в формате Avro. (При объединении двух мешков в Pig Pig автоматически маркирует поля в выходных кортежах именами, содержащими двойные двоеточия). Если вы выберете этот параметр, AvroStorage преобразует имена с двойными двоеточиями в имена с двойными подчёркиваниями.

Использование

AvroStorage хранит и загружает данные из файлов Avro. Часто вы можете загружать и сохранять данные с помощью AvroStorage, не зная многого о формате сериализации Avro. AvroStorage попытается автоматически преобразовать схему Pig и данные Pig в данные Avro или данные Avro в данные Pig.

По умолчанию, когда вы используете AvoStorage для загрузки данных, AvroStorage будет использовать поиск в глубину, чтобы найти допустимый файл Avro в пути ввода, а затем использовать схему из этого файла для загрузки данных. При использовании AvroStorage для сохранения данных AvroStorage попытается преобразовать схему Pig в эквивалентную схему Avro. Вы можете вручную указать схему, предоставив явную схему в Pig, загрузив схему из внешнего файла схемы или явно сказав Pig, чтобы он считал схему из конкретного файла avro.

Чтобы сжать свой вывод с помощью AvroStorage, необходимо использовать правильные свойства Avro для сжатия. Например, чтобы включить сжатие с использованием уровня сжатия deflate 5, необходимо указать

SET avro.output.codec 'deflate'
SET avro.mapred.deflate.level 5

Допустимые значения для avro.output.codec включают deflate, snappy и null.

Существует несколько ключевых различий между данными Avro и Pig, и в некоторых случаях полезно понять различия между моделями данных Avro и Pig. Прежде чем записывать данные Pig в Avro (или создавать файлы Avro для использования в Pig), помните, что может не быть эквивалентной схемы Avro для каждой схемы Pig (и наоборот):

  • Определения рекурсивных схем Вы не можете определять схемы рекурсивно в Pig, но можете определять их рекурсивно в Avro.
  • Разрешенные символы Схемы Pig иногда могут содержать символы, такие как двоеточие (":"), которые являются недопустимыми в именах Avro.
  • Объединения В Avro вы можете определить объект, который может быть одним из нескольких разных типов (включая сложные типы, такие как записи). В Pig это невозможно.
  • Перечисления Avro позволяет определять перечисления для эффективного и абстрактного представления категориальных переменных, но Pig этого не делает.
  • Массивы байтов фиксированной длины Avro позволяет определять массивы байтов фиксированной длины, но Pig этого не делает.
  • Значения с возможностью NULL В Pig все типы могут быть NULL. В Avro — нет.

Вот как AvroStorage преобразует значения Pig в Avro:

Исходный тип Pig Преобразованный тип Avro
Целые числа int ["int","null"]
Длинные целые числа long ["long,"null"]
Числа с плавающей запятой одинарной точности float ["float","null"]
Числа с плавающей запятой двойной точности double ["double","null"]
Строки chararray ["string","null"]
Массивы байтов bytearray ["bytes","null"]
Булевы значения boolean ["boolean","null"]
Кортежи tuple Схема Pig Tuple будет преобразована в объединение и записи Avro с эквивалентной схемой и null.
Множества кортежей bag Схема Pig Tuple будет преобразована в объединение массива записей с эквивалентной схемой и null.
Массивы map Схема Pig Tuple будет преобразована в объединение карты записей с эквивалентной схемой и null.

Вот как AvroStorage преобразует значения Avro в Pig:

Исходные типы Avro Преобразованный тип Pig
Целые числа ["int","null"] или "int" int
Длинные целые числа ["long,"null"] или "long" long
Числа с плавающей запятой одинарной точности ["float","null"] или "float" float
Числа с плавающей запятой двойной точности ["double","null"] или "double" double
Строки ["string","null"] или "string" chararray
Перечисления Перечисление или объединение перечисления и null chararray
Массивы байтов ["bytes","null"] или "bytes" bytearray
Фиксированные массивы Массив байтов фиксированной длины или объединение массива фиксированной длины и null bytearray
Булевы значения ["boolean","null"] или "boolean" boolean
Кортежи Тип записи или объединение записи и null tuple
Множества кортежей Массив или объединение массива и null bag
Массивы Массив или объединение массива и null map

Во многих случаях AvroStorage автоматически правильно преобразует данные, и вам не нужно предоставлять AvroStorage дополнительную информацию. Но иногда может быть удобно вручную указать схему AvroStorge. См. примеры ниже, чтобы узнать, как вручную указать схему с AvroStorage.

Примеры загрузки

Предположим, что у вас есть файл данных Avro (расположенный в 'stuff') со следующей схемой:

{"type" : "record",
 "name" : "stuff",
 "fields" : [
   {"name" : "label", "type" : "string"}, 
   {"name" : "value", "type" : "int"},
   {"name" : "marketingPlans", "type" : ["string", "bytearray", "null"]}
  ]
}

Кроме того, предположим, что вам не нужно значение поля "marketingPlans". (Это хорошо, потому что AvroStorage не знает, как преобразовать эту схему Avro в схему Pig). Чтобы загрузить в Pig только поля "label" и "value", вы можете вручную указать схему, передаваемую AvroStorage:

measurements = LOAD 'stuff' USING AvroStorage(
  '{"type":"record","name":"measurement","fields":[{"name":"label","type":"string"},{"name":"value","type":"int"}]}'
  );

Примеры сохранения

Предположим, что вы сохраняете набор, называемый measurements, со схемой:

measurements:{measurement:(label:chararray,value:int)}

Чтобы сохранить этот набор в файл под названием "measurements", вы можете использовать оператор:

STORE measurements INTO 'measurements' USING AvroStorage('measurement');

AvroStorage преобразует это в схему Avro

{"type":"record", 
 "name":"measurement",
 "fields" : [
   {"name" : "label", "type" : ["string", "null"]}, 
   {"name" : "value", "type" : ["int", "null"]}
  ]
} 

Но предположим, что вы знаете, что поля label и value никогда не будут NULL. Вы можете определить более точную схему вручную, используя оператор:

STORE measurements INTO 'measurements' USING AvroStorage(
  '{"type":"record","name":"measurement","fields":[{"name":"label","type":"string"},{"name":"value","type":"int"}]}'
  );

TrevniStorage

Загружает и сохраняет данные из файлов Trevni.

Синтаксис

TrevniStorage(['schema|record name'], ['options'])

Trevni — это ориентированный на столбцы формат хранения, являющийся частью проекта Apache Avro. Trevni тесно связан с Avro.

Аналогично, TrevniStorage очень тесно связан с AvroStorage и разделяет те же параметры, что и AvroStorage. См. AvroStorage для подробного описания аргументов для TrevniStorage.

AccumuloStorage

Загружает или сохраняет данные из таблицы Accumulo. Первый элемент в кортеже эквивалентен "строке" из ключа Accumulo, а столбцы в этой строке могут быть сгруппированы различными статическими или с использованием подстановочных знаков способами. Существует базовая функциональность подстановочных знаков для группировки различных семейств/спецификаторов столбцов в Map для LOAD или сериализации Map в некоторую группу семейств/спецификаторов столбцов в STORE.

Синтаксис

AccumuloStorage(['columns'[, 'options']])

Аргументы

'columns'

Список "столбцов" через запятую для чтения и записи данных. Каждый из этих столбцов может быть одного из трех типов:

  1. Литеральный
  2. Префикс семейства столбцов
  3. Префикс спецификатора столбца

Литеральный: это самое простое задание, которое представляет собой строку, разделенную двоеточием, отображающую семейство столбцов и спецификатор столбца. Это позволит читать/записывать простую скалярную величину из/в Accumulo.

Префикс семейства столбцов: при чтении данных это позволит извлечь данные из Accumulo Key-Values в текущей строке, семейство столбцов которых соответствует заданному префиксу. Это приведет к размещению Map в кортеже. При записи данных ожидается также Map в заданной позиции кортежа, ключи которого будут добавлены к префиксу семейства столбцов, будет использоваться пустой спецификатор столбца, а значение Map будет помещено в значение Accumulo.

Префикс спецификатора столбца: аналогично префиксу семейства столбцов, за исключением того, что он работает со спецификатором столбца. При чтении Accumulo Key-Values в той же строке, которые соответствуют заданному семейству и префиксу спецификатора столбца, будут помещены в единый Map. При записи данных будет использоваться указанное семейство столбцов из спецификации столбцов, ключ Map будет добавлен к спецификатору столбца, предоставленному в спецификации, а значение Map будет значением Accumulo.

Когда "columns" не задано или представляет собой пустую строку, это обрабатывается так же, как "*". То есть при отсутствии строки спецификации столбцов, при чтении все столбцы в заданной строке Accumulo будут помещены в один Map (с ключами Map, разделенными двоеточиями, для сохранения семейства/спецификатора столбцов из Accumulo). При записи ключи Map будут помещены в семейство столбцов, а спецификатор столбца будет пустым.

'options'

Строка, содержащая параметры, разделенные пробелами ("optionA значениеA -optionB значениеB -optionC значениеC")

В настоящее время поддерживаются следующие параметры:

  • (-c|--caster) LoadStoreCasterImpl Реализация LoadStoreCaster для использования при сериализации типов в Accumulo, обычно AccumuloBinaryConverter или UTF8StringConverter, по умолчанию UTF8StorageConverter.
  • (-auths|--authorizations) auth1,auth2... Список авторизаций Accumulo через запятую для использования при чтении данных из Accumulo. По умолчанию пустой набор авторизаций (ни один).
  • (-s|--start) start_row Строка Accumulo, с которой начинается чтение, включительно
  • (-e|--end) end_row Строка Accumulo, до которой читаются данные, включительно
  • (-buff|--mutation-buffer-size) num_bytes Количество байтов для буферизации при записи данных в Accumulo. Более высокое значение требует больше памяти
  • (-wt|--write-threads) num_threads Количество потоков, используемых для записи данных в Accumulo.
  • (-ml|--max-latency) milliseconds Максимальное время в миллисекундах перед сбросом данных в Accumulo.
  • (-sep|--separator) str Разделитель, используемый при анализе спецификации столбцов, по умолчанию запятая (,)
  • (-iw|--ignore-whitespace) (true|false) Необходимо ли удалять пробелы из спецификации столбцов, по умолчанию true

Использование

AccumuloStorage имеет возможность сохранять и извлекать данные из Accumulo. Его целью является предоставление простой и широко применимой схемы таблиц, совместимой с API Pig. Каждый кортеж содержит подмножество столбцов, хранящихся в одной строке таблицы Accumulo, что зависит от столбцов, переданных в качестве аргументов функции. Если задан '*', будут возвращены все столбцы в таблице. Второй аргумент предоставляет управление различными параметрами, которые могут быть использованы для изменения различных свойств.

При вызове сценариев Pig, использующих AccumuloStorage, важно убедиться, что Pig имеет jar-файлы Accumulo в своем пути к классам. Это легко достигается с помощью переменной окружения ACCUMULO_HOME.

PIG_CLASSPATH="$ACCUMULO_HOME/lib/*:$PIG_CLASSPATH" pig my_script.pig

Пример загрузки

Просто извлечь все столбцы из кодов аэропортов, которые находятся между Бостоном и Сан-Франциско, которые можно просмотреть с авторизациями Accumulo «auth1» и/или «auth2».

raw = LOAD 'accumulo://airports?instance=accumulo&user=root&password=passwd&zookeepers=localhost'
      USING org.apache.pig.backend.hadoop.accumulo.AccumuloStorage(
      '*', '-a auth1,auth2 -s BOS -e SFO') AS
      (code:chararray, all_columns:map[]);

Типы данных столбцов объявляются с помощью предложения «AS». В этом примере ключ строки, который представляет собой уникальный код аэропорта, назначается переменной «код», в то время как все остальные столбцы помещаются в карту. Когда квалификатор столбца не пустой, ключ в этой карте будет содержать двоеточие, которое отделяет часть ключа, взятую из семейства столбцов, от части, взятой из квалификатора столбца. Значение Accumulo помещается в значение карты.

Большинство раз не требуется и нежелательно по причинам производительности извлекать все столбцы.

raw = LOAD 'accumulo://airports?instance=accumulo&user=root&password=passwd&zookeepers=localhost'
      USING org.apache.pig.backend.hadoop.accumulo.AccumuloStorage(
      'name,building:num_terminals,carrier*,reviews:transportation*') AS
      (code:chararray name:bytearray carrier_map:map[] transportion_reviews_map:map[]);

Для группировки набора столбцов в одну карту вместо перечисления каждого столбца можно использовать звездочку при запросе столбцов.

Пример сохранения

Данные можно легко сохранить в Accumulo.

A = LOAD 'flights.txt' AS (id:chararray, carrier_name:chararray, src_airport:chararray, dest_airport:chararray, tail_number:int);
STORE A INTO 'accumulo://flights?instance=accumulo&user=root&password=passwd&zookeepers=localhost' USING 
    org.apache.pig.backend.hadoop.accumulo.AccumuloStorage('carrier_name,src_airport,dest_airport,tail_number');

Здесь мы читаем файл «flights.txt» из HDFS и сохраняем результаты в отношение A. Мы извлекаем уникальный идентификатор рейса, его пункт отправления и назначения, а также номер борта из заданного файла. При сохранении обратно в Accumulo мы указываем спецификации столбцов (в данном случае только семейство столбцов). Также важно отметить, что в качестве столбцов предоставляется четыре элемента, поскольку первый элемент в кортеже используется в качестве строки в Accumulo.

OrcStorage

Загружает данные из файла Orc или сохраняет в него.

Синтаксис

OrcStorage(['options'])

Параметры

Строка, содержащая разделенные пробелами параметры ('-optionA valueA -optionB valueB -optionC '). Текущие параметры применимы только к операции STORE, а не к LOAD.

В настоящее время поддерживаются следующие параметры:

  • --stripeSize или -s Устанавливает размер полосы для файла. По умолчанию 268435456 (256 МБ).
  • --rowIndexStride или -r Устанавливает расстояние между записями в индексе строк. По умолчанию 10000.
  • --bufferSize или -b Устанавливает размер буферов памяти, используемых для сжатия и хранения полосы в памяти. По умолчанию 262144 (256 КБ).
  • --blockPadding или -p Устанавливает, будут ли блоки HDFS заполнены, чтобы избежать разделения полос между блоками. По умолчанию true.
  • --compress или -c Устанавливает общее сжатие, которое используется для сжатия данных. Допустимые кодеки: NONE, ZLIB, SNAPPY, LZO. По умолчанию ZLIB.
  • --version или -v Устанавливает версию файла, который будет записан

Пример

OrcStorage как StoreFunc.

A = LOAD 'student.txt' as (name:chararray, age:int, gpa:double);
store A into 'student.orc' using OrcStorage('-c SNAPPY'); -- store student.txt into data.orc with SNAPPY compression

OrcStorage как LoadFunc.

A = LOAD 'student.orc' USING OrcStorage();
describe A; -- See the schema of student.orc
B = filter A by age > 25 and gpa < 3; -- filter condition will be pushed up to loader
dump B; -- dump the content of student.orc

Типы данных

Большинство типов данных Orc имеет взаимно однозначное соответствие с типами данных Pig. Есть несколько исключений:

Сторона загрузчика:

  • Orc STRING/CHAR/VARCHAR все сопоставляются с Pig varchar
  • Orc BYTE/BINARY все сопоставляются с Pig bytearray
  • Orc TIMESTAMP/DATE все сопоставляются с Pig datetime
  • Orc DECIMAL сопоставляется с Pig bigdecimal

Сторона сохранителя:

  • Pig chararray сопоставляется с Orc STRING
  • Pig datetime сопоставляется с Orc TIMESTAMP
  • Pig bigdecimal/biginteger все сопоставляются с Orc DECIMAL
  • Pig bytearray сопоставляется с Orc BINARY

Предсказуемое продвижение

Если после OrcStorage есть оператор фильтрации, Pig продвинет условие фильтрации к загрузчику. OrcStorage будет обрезать файлы/полосы/группы строк, которые полностью не удовлетворяют условию. Для файла/полосы/группы строк, содержащих данные, которые удовлетворяют условию фильтрации, OrcStorage загрузит файл/полосу/группу строк, и Pig повторно проверит условие фильтрации, чтобы удалить дополнительные данные, которые не удовлетворяют условию фильтрации.

Предсказуемое продвижение OrcStorage в настоящее время поддерживает все примитивные типы данных, но ни один из сложных типов данных. Например, условие карты не может быть продвинуто в OrcStorage:

A = LOAD 'student.orc' USING OrcStorage();
B = filter A by info#'age' > 25; -- map condition cannot push to OrcStorage
dump B;

В настоящее время в предсказуемом продвижении OrcStorage поддерживаются следующие выражения в условии фильтрации: >, >=, <, <=, ==, !=, between, in, and, or, not. Отсутствуют выражения: is null, is not null, matches.

Функции математики

Для общей информации об этих функциях см. Спецификацию Java API, Класс Math. Обратите внимание на следующее:

  • Имена функций Pig чувствительны к регистру и написаны ПРОПИСНЫМИ буквами.

  • Pig может обрабатывать результаты по-разному, чем указано в спецификации Java API:

    • Если результирующее значение равно null или пусто, Pig возвращает null.

    • Если результирующее значение не является числом (NaN), Pig возвращает null.

    • Если Pig не может обработать выражение, Pig возвращает исключение.

ABS

Возвращает абсолютное значение выражения.

Синтаксис

ABS(expression)

Термины

expression

Любое выражение, результатом которого является тип int, long, float или double.

Использование

Используйте функцию ABS для возврата абсолютного значения выражения. Если результат не является отрицательным (x ≥ 0), возвращается результат. Если результат отрицательный (x < 0), возвращается отрицание результата.

ACOS

Возвращает арккосинус выражения.

Синтаксис

ACOS(expression)

Термины

expression

Выражение, результатом которого является тип double.

Использование

Используйте функцию ACOS для возврата арккосинуса выражения.

ASIN

Возвращает арксинус выражения.

Синтаксис

ASIN(expression)

Термины

expression

Выражение, результатом которого является тип double.

Использование

Используйте функцию ASIN для возврата арксинуса выражения.

ATAN

Возвращает арктангенс выражения.

Синтаксис

ATAN(expression)

Термины

expression

Выражение, результатом которого является тип double.

Использование

Используйте функцию ATAN для возврата арктангенса выражения.

CBRT

Возвращает кубический корень выражения.

Синтаксис

CBRT(expression)

Термины

expression

Выражение, результатом которого является тип double.

Использование

Используйте функцию CBRT для возврата кубического корня выражения.

CEIL

Возвращает значение выражения, округленное вверх до ближайшего целого числа.

Синтаксис

CEIL(expression)

Термины

expression

Выражение, результатом которого является тип double.

Использование

Используйте функцию CEIL для возврата значения выражения, округленного вверх до ближайшего целого числа. Эта функция никогда не уменьшает результирующее значение.

x

CEIL(x)

4.6

5

3.5

4

2.4

3

1.0

1

-1.0

-1

-2.4

-2

-3.5

-3

-4.6

-4

COS

Возвращает тригонометрический косинус выражения.

Синтаксис

COS(expression)

Термины

expression

Выражение (угол), результатом которого является тип double.

Использование

Используйте функцию COS для возврата тригонометрического косинуса выражения.

COSH

Возвращает гиперболический косинус выражения.

Синтаксис

COSH(expression)

Термины

expression

Выражение, результатом которого является тип double.

Использование

Используйте функцию COSH для возврата гиперболического косинуса выражения.

EXP

Возвращает число Эйлера e, возведенное в степень x.

Синтаксис

EXP(expression)

Термины

expression

Выражение, результатом которого является тип double.

Использование

Используйте функцию EXP для возврата значения числа Эйлера e, возведенного в степень x (где x — результирующее значение выражения).

FLOOR

Возвращает значение выражения, округленное вниз до ближайшего целого числа.

Синтаксис

FLOOR(expression)

Термины

expression

Выражение, результатом которого является тип double.

Использование

Используйте функцию FLOOR для возврата значения выражения, округленного вниз до ближайшего целого числа. Эта функция никогда не увеличивает результирующее значение.

x

FLOOR(x)

4.6

4

3.5

3

2.4

2

1.0

1

-1.0

-1

-2.4

-3

-3.5

-4

-4.6

-5

LOG

Возвращает натуральный логарифм (по основанию e) выражения.

Синтаксис

LOG(expression)

Термины

expression

Выражение, результатом которого является тип double.

Использование

Используйте функцию LOG для возврата натурального логарифма (по основанию e) выражения.

LOG10

Возвращает логарифм по основанию 10 выражения.

Синтаксис

LOG10(expression)

Термины

expression

Выражение, результатом которого является тип double.

Использование

Используйте функцию LOG10 для возврата логарифма по основанию 10 выражения.

RANDOM

Возвращает псевдослучайное число.

Синтаксис

RANDOM( )

Термины

N/A

Нет терминов.

Использование

Используйте функцию RANDOM для возврата псевдослучайного числа (тип double), большего или равного 0,0 и меньшего 1,0.

ROUND

Возвращает значение выражения, округленное до целого числа.

Синтаксис

ROUND(expression)

Термины

expression

Выражение, результатом которого является тип float или double.

Использование

Используйте функцию ROUND для возврата значения выражения, округленного до целого числа (если тип результата — float) или округленного до long (если тип результата — double).

Значения округляются в сторону положительной бесконечности: round(x) = floor(x + 0.5).

x

ROUND(x)

4.6

5

3.5

4

2.4

2

1.0

1

-1.0

-1

-2.4

-2

-3.5

-3

-4.6

-5

ROUND_TO

Возвращает значение выражения, округленного до фиксированного количества десятичных знаков.

Синтаксис

ROUND_TO(val, digits [, mode])

Термины

val

Выражение, результатом которого является тип float или double: значение для округления.

digits

Выражение, результатом которого является тип int: количество знаков для сохранения.

mode

Необязательный int, указывающий метод округления, в соответствии с константами, предоставляемыми Java.

Использование

Используйте функцию ROUND для возврата значения выражения, округленного до фиксированного количества знаков. Для float результатом будет float; для double результатом будет double.

Результат является кратным digits-ой степени десяти: 0 приводит к отсутствию дробных знаков; отрицательное значение обнуляет соответствующее количество мест слева от десятичной точки.

Когда mode опущен или имеет значение 6 (RoundingMode.HALF_EVEN), результат округляется до ближайшего соседа, а при равенстве расстояний до ближайших чисел происходит округление к ближайшему четному числу. Этот метод минимизирует накопленную ошибку и, как правило, сохраняет среднее значение набора значений.

Когда mode имеет значение 4 (RoundingMode.HALF_UP), результат округляется до ближайшего соседа, а при равенстве расстояний до ближайших чисел происходит округление от нуля. Этот режим соответствует поведению большинства СУБД SQL.

Для других методов округления обратитесь к документации Java. Нет метода округления, который соответствовал бы поведению Math.round (т. е. округление к положительной бесконечности) — вините Java, а не Pig.

val

digits

mode

ROUND_TO(val, digits)

1234.1789

8

1234.1789

1234.1789

4

1234.1789

1234.1789

1

1234.2

1234.1789

0

1234.0

1234.1789

-1

1230.0

1234.1789

-3

1000.0

1234.1789

-4

0.0

3.25000001

1

3.3

3.25

1

3.2

-3.25

1

-3.2

3.15

1

3.2

-3.15

1

-3.2

3.25

1

4

3.3

-3.25

1

4

-3.3

3.5

0

4.0

-3.5

0

-4.0

2.5

0

2.0

-2.5

0

-2.0

3.5

0

4

4.0

-3.5

0

4

-4.0

2.5

0

4

3.0

-2.5

0

4

-3.0

SIN

Возвращает синус выражения.

Синтаксис

SIN(expression)

Термины

expression

Выражение, результатом которого является double.

Использование

Используйте функцию SIN для возврата синуса выражения.

SINH

Возвращает гиперболический синус выражения.

Синтаксис

SINH(expression)

Термины

expression

Выражение, результатом которого является double.

Использование

Используйте функцию SINH для возврата гиперболического синуса выражения.

SQRT

Возвращает положительный квадратный корень выражения.

Синтаксис

SQRT(expression)

Термины

expression

Выражение, результатом которого является double.

Использование

Используйте функцию SQRT для возврата положительного квадратного корня выражения.

TAN

Возвращает тригонометрический тангенс угла.

Синтаксис

TAN(expression)

Термины

expression

Выражение (угол), результатом которого является double.

Использование

Используйте функцию TAN для возврата тригонометрического тангенса угла.

TANH

Возвращает гиперболический тангенс выражения.

Синтаксис

TANH(expression)

Термины

expression

Выражение, результатом которого является double.

Использование

Используйте функцию TANH для возврата гиперболического тангенса выражения.

Строковые функции

Для общей информации об этих функциях, см. Java API Specification, Class String. Обратите внимание на следующее:

  • Имена функций Pig чувствительны к регистру и записываются в ВЕРХНЕМ РЕГИСТРЕ.

  • Функции Pig для строк имеют дополнительный первый параметр: строку, к которой применяются все операции.

  • Pig может обрабатывать результаты иначе, чем указано в Java API Specification. Если любой из входных параметров равен null или если предоставлено недостаточное количество параметров, возвращается NULL.

ENDSWITH

Проверяет входные данные, чтобы определить, заканчивается ли первый аргумент строкой во втором.

Синтаксис

ENDSWITH(строка, сравнение)

Термины

строка

Строка, которая будет проверена.

сравнение

Строка для сравнения.

Использование

Используйте функцию ENDSWITH, чтобы определить, заканчивается ли первый аргумент строкой во втором.

Например, ENDSWITH ('foobar', 'foo') вернёт false, а ENDSWITH ('foobar', 'bar') вернёт true.

EqualsIgnoreCase

Сравнивает две строки, игнорируя регистр.

Синтаксис

EqualsIgnoreCase(строка1, строка2)

Термины

строка1

Исходная строка.

строка2

Строка для сравнения.

Использование

Используйте функцию EqualsIgnoreCase, чтобы определить, равны ли две строки, игнорируя регистр.

INDEXOF

Возвращает индекс первого вхождения символа в строке, выполняя поиск вперёд с указанного начального индекса.

Синтаксис

INDEXOF(строка, 'символ', начальныйИндекс)

Термины

строка

Строка, в которой выполняется поиск.

'символ'

Искомый символ, в кавычках.

начальныйИндекс

Индекс, с которого начинается поиск вперёд.

Индекс строки начинается с нуля (0).

Использование

Используйте функцию INDEXOF, чтобы определить индекс первого вхождения символа в строке. Поиск символа вперёд начинается с указанного начального индекса.

LAST_INDEX_OF

Возвращает индекс последнего вхождения символа в строке, выполняя поиск назад от конца строки.

Синтаксис

LAST_INDEX_OF(строка, 'символ')

Термины

строка

Строка, в которой выполняется поиск.

'символ'

Искомый символ, в кавычках.

Использование

Используйте функцию LAST_INDEX_OF, чтобы определить индекс последнего вхождения символа в строке. Поиск символа назад начинается с конца строки.

LCFIRST

Преобразует первый символ в строке в нижний регистр.

Синтаксис

LCFIRST(выражение)

Термины

выражение

Выражение, результат которого имеет тип chararray.

Использование

Используйте функцию LCFIRST для преобразования только первого символа в строке в нижний регистр.

LOWER

Преобразует все символы в строке в нижний регистр.

Синтаксис

LOWER(выражение)

Термины

выражение

Выражение, результат которого имеет тип chararray.

Использование

Используйте функцию LOWER для преобразования всех символов в строке в нижний регистр.

LTRIM

Возвращает копию строки с удалёнными только ведущими пробелами.

Синтаксис

LTRIM(выражение)

Термины

выражение

Выражение, результат которого — chararray.

Использование

Используйте функцию LTRIM для удаления ведущих пробелов из строки.

REGEX_EXTRACT

Выполняет сопоставление с регулярным выражением и извлекает совпадающую группу, определённую индексом.

Синтаксис

REGEX_EXTRACT (строка, регулярноеВыражение, индекс)

Термины

строка

Строка, в которой выполняется сопоставление.

регулярноеВыражение

Регулярное выражение.

индекс

Индекс совпадающей группы, которую нужно вернуть.

Использование

Используйте функцию REGEX_EXTRACT для выполнения сопоставления с регулярным выражением и извлечения совпадающей группы, определённой индексом (где индекс — параметр, начинающийся с 1). Функция использует форму регулярных выражений Java.

Функция возвращает строку, соответствующую совпадающей группе в указанной позиции. Если в этой позиции нет совпавшей части выражения, возвращается NULL.

Пример

Этот пример вернёт строку '192.168.1.5'.

REGEX_EXTRACT('192.168.1.5:8020', '(.*):(.*)', 1);

REGEX_EXTRACT_ALL

Выполняет сопоставление с регулярным выражением и извлекает все совпадающие группы.

Синтаксис

REGEX_EXTRACT_ALL (строка, регулярноеВыражение)

Термины

строка

Строка, в которой выполняется сопоставление.

регулярноеВыражение

Регулярное выражение.

Использование

Используйте функцию REGEX_EXTRACT_ALL для выполнения сопоставления с регулярным выражением и извлечения всех совпадающих групп. Функция использует форму регулярных выражений Java.

Функция возвращает кортеж, где каждый элемент представляет собой совпавшее выражение. Если совпадений нет, возвращается пустой кортеж.

Пример

Этот пример вернёт кортеж (192.168.1.5,8020).

REGEX_EXTRACT_ALL('192.168.1.5:8020', '(.*)\:(.*)');

REPLACE

Заменяет существующие символы в строке новыми символами.

Синтаксис

REPLACE(строка, 'регулярноеВыражение', 'новыйСимвол');

Термины

строка

Строка, которая будет обновлена.

'регулярноеВыражение'

Регулярное выражение для сопоставления строки, в кавычках.

'новыйСимвол'

Новые символы, заменяющие существующие символы, в кавычках.

Использование

Используйте функцию REPLACE для замены существующих символов в строке новыми символами.

Например, чтобы изменить "open source software" на "open source wiki", используйте это выражение: REPLACE(строка,'software','wiki')

Обратите внимание, что функция REPLACE внутренне реализована с помощью java.string.replaceAll(String regex, String replacement), где 'регулярноеВыражение' и 'новыйСимвол' передаются в качестве первого и второго аргумента соответственно. Если вы хотите заменить специальные символы, такие как '[', в строковой литерале, необходимо экранировать их в 'регулярноеВыражение', добавив перед ними двойные обратные слэши (например, '\\[').

RTRIM

Возвращает копию строки с удалёнными только хвостовыми пробелами.

Синтаксис

RTRIM(выражение)

Термины

выражение

Выражение, результат которого — chararray.

Использование

Используйте функцию RTRIM для удаления хвостовых пробелов из строки.

SPRINTF

Форматирует набор значений в соответствии с шаблоном в стиле printf, используя библиотеку native Java Formatter.

Синтаксис

SPRINTF(шаблон, [...значения])

Термины

шаблон

Строка в стиле printf, описывающая шаблон.

значения

Значения, которые нужно разместить в шаблоне. Должен быть элемент кортежа для каждого места ввода формата, и он должен иметь правильный тип: int или long для целочисленных форматов, таких как %d; float или double для десятичных форматов, таких как %f; и long для форматов даты/времени, таких как %t.

Использование

Используйте функцию SPRINTF для форматирования строки в соответствии с шаблоном. Например, SPRINTF("part-%05d", 69) вернёт 'part-00069'.

Спецификация формата строки

arg1

arg2

arg3

SPRINTF(формат, arg1, arg2)

примечания

'%8s|%8d|%-8s'

1234567

1234567

'yay'

' 1234567| 1234567|yay '

Строки формата с %s, целые числа с %d. Типы преобразуются для вас, где это возможно (здесь int -> string).

(значение null)

1234567

1234567

'yay'

(значение null)

Возвращает null (без ошибок или предупреждений) со строкой формата null.

'%8s|%8d|%-8s'

1234567

(значение null)

'yay'

(значение null)

Возвращает null (без ошибок или предупреждений), если какой-либо аргумент имеет значение null.

'%8.3f|%6x'

123.14159

665568

' 123.142| a27e0'

Форматирование чисел с плавающей точкой/двойной точностью с помощью %f, шестнадцатеричные целые числа с %x (есть и другие — см. документацию Java)

'%,+10d|%(06d'

1234567

-123

'+1,234,567|(0123)'

Числа принимают модификатор префикса: , для разделителей тысяч, специфичных для локали; 0 для заполнения нулями; +, чтобы всегда показывать знак плюс для положительных чисел; пробел, чтобы разрешить пробел перед положительными числами; (, чтобы указывать отрицательные числа в скобках (в стиле бухгалтера).

'%2$5d: %3$6s %1$3s %2$4x (%<4X)'

'the'

48879

'wheres'

'48879: wheres the beef (BEEF)'

Ссылка на аргументы позиционно и столько раз, сколько нужно, используя %(pos)$.... Используйте %<..., чтобы обратиться к ранее указанному аргументу.

'Launch Time: %14d %s'

ToMilliSeconds(CurrentTime())

ToString(CurrentTime(), 'yyyy-MM-dd HH:mm:ss Z')

'Launch Time: 1400164132000 2014-05-15 09:28:52 -0500'

Вместо этого используйте ToString для форматирования частей даты/времени и SPRINTF для вывода результатов.

'%8s|%-8s'

1234567

MissingFormatArgumentException: Форматный спецификатор '%-8s'

Вы должны предоставить аргументы для всех спецификаторов

'%8s'

1234567

'ignored'

'also'

1234567

В порядке предоставление слишком большого количества аргументов

Примечание: хотя форматировщик Java (и, следовательно, эта функция) предлагает спецификатор %t для элементов даты/времени, от него лучше отказаться: он громоздкий, вывод и обработка часовых поясов могут отличаться от ожидаемого, и он не принимает объекты даты и времени из pig. Вместо этого просто подготовьте даты с помощью UDF ToString, как показано.

STARTSWITH

Проверяет входные данные, чтобы определить, начинается ли первый аргумент со строки во втором.

Синтаксис

STARTSWITH(строка, проверкаНа)

Термины

строка

Строка, которая должна быть проверена.

проверкаНа

Строка для проверки.

Использование

Используйте функцию STARTSWITH для определения, начинается ли первый аргумент со строки во втором.

Например, STARTSWITH ('foobar', 'foo') вернёт true, а STARTSWITH ('foobar', 'bar') вернёт false.

STRSPLIT

Разбивает строку по совпадениям с заданным регулярным выражением.

Синтаксис

STRSPLIT(строка, регулярноеВыражение, ограничение)

Термины

строка

Строка, которая должна быть разделена.

регулярноеВыражение

Регулярное выражение.

ограничение

Если значение положительно, шаблон (скомпилированное представление регулярного выражения) применяется не более чем limit-1 раз, поэтому значение аргумента означает максимальную длину кортежа результатов. Последний элемент кортежа результатов будет содержать весь вход после последнего совпадения. Если значение отрицательно, ограничение на длину кортежа результатов не применяется. Если значение равно нулю, ограничение на длину кортежа результатов также не применяется, а пустые хвостовые строки (если таковые имеются) будут удалены.

Использование

Используйте функцию STRSPLIT для разделения строки по совпадениям с заданным регулярным выражением.

Например, для строки (open:source:software), STRSPLIT (строка, ':',2) вернёт ((open,source:software)), а STRSPLIT (строка, ':',3) вернёт ((open,source,software)).

STRSPLITTOBAG

Разбивает строку по совпадениям с заданным регулярным выражением и возвращает пакет данных

Синтаксис

STRSPLITTOBAG(строка, регулярноеВыражение, ограничение)

Термины

строка

Строка, которая должна быть разделена.

регулярноеВыражение

Регулярное выражение.

ограничение

Если значение положительно, шаблон (скомпилированное представление регулярного выражения) применяется не более чем limit-1 раз, поэтому значение аргумента означает максимальный размер пакета результатов. Последний кортеж пакета результатов будет содержать весь вход после последнего совпадения. Если значение отрицательно, ограничение на размер пакета результатов не применяется. Если значение равно нулю, ограничение на размер пакета результатов также не применяется, а пустые хвостовые строки (если таковые имеются) будут удалены.

Использование

Используйте функцию STRSPLITTOBAG для разделения строки по совпадениям с заданным регулярным выражением.

Например, для строки (open:source:software), STRSPLITTOBAG (строка, ':',2) вернёт {(open),(source:software)}, а STRSPLITTOBAG (строка, ':',3) вернёт {(open),(source),(software)}.

SUBSTRING

Возвращает подстроку из заданной строки.

Синтаксис

SUBSTRING(строка, начальныйИндекс, конечныйИндекс)

Термины

строка

Строка, из которой будет извлечена подстрока.

начальныйИндекс

Индекс (тип целое число) первой буквы подстроки.

Индекс строки начинается с нуля (0).

конечныйИндекс

Индекс (тип целое число) символа, следующего за последним символом подстроки.

Использование

Используйте функцию SUBSTRING для возвращения подстроки из заданной строки.

Для поля с именем alpha, значение которого ABCDEF, чтобы вернуть подстроку BCD используйте это выражение: SUBSTRING(alpha,1,4). Обратите внимание, что 1 — это индекс B (первый символ подстроки), а 4 — индекс E (символ, следующий за последним символом подстроки).

TRIM

Возвращает копию строки со удалёнными начальными и конечными пробелами.

Синтаксис

TRIM(выражение)

Термины

выражение

Выражение, результат которого — chararray.

Использование

Используйте функцию TRIM для удаления начальных и конечных пробелов из строки.

UCFIRST

Возвращает строку с первым символом, преобразованным в верхний регистр.

Синтаксис

UCFIRST(выражение)

Термины

выражение

Выражение, результат которого имеет тип chararray.

Использование

Используйте функцию UCFIRST для преобразования только первого символа строки в верхний регистр.

UPPER

Возвращает строку, преобразованную в верхний регистр.

Синтаксис

UPPER(выражение)

Термины

выражение

Выражение, результат которого имеет тип chararray.

Использование

Используйте функцию UPPER для преобразования всех символов строки в верхний регистр.

UniqueID

Возвращает уникальный идентификатор строки для каждой записи в псевдониме.

Использование

UniqueID генерирует уникальный идентификатор для каждой записи. Идентификатор имеет вид "taskindex-последовательность"

Функции работы с датой и временем

Для общей информации об операциях с типом datetime, см. Спецификацию API Java, класс Java Date и класс JODA DateTime. А для информации о форматах дат и времени ISO, см. Форматы дат и времени.

ДобавитьПродолжительность

Возвращает результат объекта DateTime плюс объект Duration.

Синтаксис

AddDuration(datetime, duration)

Термины

datetime

Объект datetime.

duration

Строка продолжительности в формате ISO 8601.

Использование

Используйте функцию AddDuration для создания нового объекта datetime, добавив определенную продолжительность к заданному объекту datetime.

ТекущееВремя

Возвращает объект DateTime текущего времени.

Синтаксис

CurrentTime()

Использование

Используйте функцию CurrentTime для генерации объекта datetime текущего временного отметки с точностью до миллисекунд.

ДниМежду

Возвращает количество дней между двумя объектами DateTime.

Синтаксис

DaysBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

Другой объект datetime.

Использование

Используйте функцию DaysBetween для получения количества дней между двумя заданными объектами datetime.

ПолучитьДень

Возвращает день месяца из объекта DateTime.

Синтаксис

GetDay(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию GetDay для извлечения дня месяца из заданного объекта datetime.

ПолучитьЧас

Возвращает час дня из объекта DateTime.

Синтаксис

GetHour(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию GetHour для извлечения часа дня из заданного объекта datetime.

ПолучитьМиллисекунды

Возвращает миллисекунды секунды из объекта DateTime.

Синтаксис

GetMilliSecond(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию GetMilliSecond для извлечения миллисекунд секунды из заданного объекта datetime.

ПолучитьМинуту

Возвращает минуту часа из объекта DateTime.

Синтаксис

GetMinute(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию GetMinute для извлечения минуты часа из заданного объекта datetime.

ПолучитьМесяц

Возвращает месяц года из объекта DateTime.

Синтаксис

GetMonth(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию GetMonth для извлечения месяца года из заданного объекта datetime.

ПолучитьСекунду

Возвращает секунду минуты из объекта DateTime.

Синтаксис

GetSecond(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию GetSecond для извлечения секунды минуты из заданного объекта datetime.

ПолучитьНеделю

Возвращает неделю недели года из объекта DateTime.

Синтаксис

GetWeek(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию GetWeek для извлечения недели года из заданного объекта datetime. Обратите внимание, что год недели может отличаться от года.

ПолучитьГодНедели

Возвращает год недели из объекта DateTime.

Синтаксис

GetWeekYear(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию GetWeekYear для извлечения года недели из заданного объекта datetime. Обратите внимание, что год недели может отличаться от года.

ПолучитьГод

Возвращает год из объекта DateTime.

Синтаксис

GetYear(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию GetYear для извлечения года из заданного объекта datetime.

ЧасыМежду

Возвращает количество часов между двумя объектами DateTime.

Синтаксис

HoursBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

Другой объект datetime.

Использование

Используйте функцию HoursBetween для получения количества часов между двумя заданными объектами datetime.

МиллисекундыМежду

Возвращает количество миллисекунд между двумя объектами DateTime.

Синтаксис

MilliSecondsBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

Другой объект datetime.

Использование

Используйте функцию MilliSecondsBetween для получения количества миллисекунд между двумя заданными объектами datetime.

МинутыМежду

Возвращает количество минут между двумя объектами DateTime.

Синтаксис

MinutesBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

Другой объект datetime.

Использование

Используйте функцию MinutesBetween для получения количества минут между двумя заданными объектами datetime.

МесяцыМежду

Возвращает количество месяцев между двумя объектами DateTime.

Синтаксис

MonthsBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

Другой объект datetime.

Использование

Используйте функцию MonthsBetween для получения количества месяцев между двумя заданными объектами datetime.

СекундыМежду

Возвращает количество секунд между двумя объектами DateTime.

Синтаксис

SecondsBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

Другой объект datetime.

Использование

Используйте функцию SecondsBetween для получения количества секунд между двумя заданными объектами datetime.

ВычестьПродолжительность

Возвращает результат объекта DateTime минус объект Duration.

Синтаксис

SubtractDuration(datetime, duration)

Термины

datetime

Объект datetime.

duration

Строка продолжительности в формате ISO 8601.

Использование

Используйте функцию AddDuration для создания нового объекта datetime, добавив определённую продолжительность к существующему объекту datetime.

ToDate

Возвращает объект DateTime в соответствии с параметрами.

Синтаксис

ToDate(milliseconds)

ToDate(iosstring)

ToDate(userstring, format)

ToDate(userstring, format, timezone)

Термины

millseconds

Смещение от 1970-01-01T00:00:00.000Z в миллисекундах (положительное или отрицательное).

isostring

Строка datetime в формате ISO 8601.

userstring

Строка datetime в пользовательском формате.

format

Строка шаблона формата даты и времени (см. класс Java SimpleDateFormat).

timezone

Строка часового пояса. Можно использовать как смещение от UTC, так и формат, основанный на местоположении. Внутренне часовой пояс преобразуется в формат смещения от UTC.

См. документацию Joda-Time для доступных идентификаторов часовых поясов.

Использование

Используйте функцию ToDate для создания объекта DateTime. Обратите внимание, что если часовой пояс не указан в строке ISO datetime или в параметре timezone, используется значение по умолчанию.

ToMilliSeconds

Возвращает количество миллисекунд, прошедших с 1 января 1970 года 00:00:00.000 GMT для объекта DateTime.

Синтаксис

ToMilliSeconds(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию ToMilliSeconds для преобразования DateTime в количество миллисекунд, прошедших с 1 января 1970 года 00:00:00.000 GMT.

ToString

ToString преобразует объект DateTime в строку в формате ISO или пользовательском формате.

Синтаксис

ToString(datetime [, строка формата])

Термины

datetime

Объект datetime.

строка формата

Строка шаблона формата даты и времени (см. класс Java SimpleDateFormat).

Использование

Используйте функцию ToString для преобразования DateTime в строку в пользовательском формате.

ToUnixTime

Возвращает Unix Time как значение типа long для объекта DateTime. Unix Time — это количество секунд, прошедших с 1 января 1970 года 00:00:00.000 GMT.

Синтаксис

ToUnixTime(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию ToUnixTime для преобразования DateTime в Unix Time.

WeeksBetween

Возвращает количество недель между двумя объектами DateTime.

Синтаксис

WeeksBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

Другой объект datetime.

Использование

Используйте функцию WeeksBetween для получения количества недель между двумя заданными объектами datetime.

YearsBetween

Возвращает количество лет между двумя объектами DateTime.

Синтаксис

YearsBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

Другой объект datetime.

Использование

Используйте функцию YearsBetween для получения количества лет между двумя заданными объектами datetime.

Функции кортежей, мешков, карт

TOTUPLE

Преобразует одно или несколько выражений в тип кортеж.

Синтаксис

TOTUPLE(expression [, expression ...])

Термины

expression

Выражение любого типа данных.

Использование

Используйте функцию TOTUPLE для преобразования одного или нескольких выражений в кортеж.

См. также: Тип данных кортеж и Операторы построения типов

Пример

В этом примере поля f1, f2 и f3 преобразуются в кортеж.

a = LOAD 'student' AS (f1:chararray, f2:int, f3:float);
DUMP a;

(John,18,4.0)
(Mary,19,3.8)
(Bill,20,3.9)
(Joe,18,3.8)

b = FOREACH a GENERATE TOTUPLE(f1,f2,f3);
DUMP b;

((John,18,4.0))
((Mary,19,3.8))
((Bill,20,3.9))
((Joe,18,3.8))

TOBAG

Преобразует одно или несколько выражений в тип мешок.

Синтаксис

TOBAG(expression [, expression ...])

Термины

expression

Выражение любого типа данных.

Использование

Используйте функцию TOBAG для преобразования одного или нескольких выражений в отдельные кортежи, которые затем помещаются в мешок.

См. также: Тип данных мешок и Операторы построения типов

Пример

В этом примере поля f1 и f3 преобразуются в кортежи, которые затем помещаются в мешок.

a = LOAD 'student' AS (f1:chararray, f2:int, f3:float);
DUMP a;

(John,18,4.0)
(Mary,19,3.8)
(Bill,20,3.9)
(Joe,18,3.8)

b = FOREACH a GENERATE TOBAG(f1,f3);
DUMP b;

({(John),(4.0)})
({(Mary),(3.8)})
({(Bill),(3.9)})
({(Joe),(3.8)})

TOMAP

Преобразует пары выражений "ключ/значение" в карту.

Синтаксис

TOMAP(key-expression, value-expression [, key-expression, value-expression ...])

Термины

key-expression

Выражение типа chararray.

value-expression

Выражение любого типа, поддерживаемого картой.

Использование

Используйте функцию TOMAP для преобразования пар выражений в карту. Обратите внимание на следующее:

  • Вы должны указать чётное количество выражений в качестве параметров.
  • Элементы должны соответствовать правилам типа карты:
    • Каждый нечётный элемент (key-expression) должен быть типа chararray, так как только chararray могут быть ключами в карте.
    • Каждый чётный элемент (value-expression) может быть любого типа, поддерживаемого картой.

См. также: Тип данных карта и Операторы построения типов

Пример

В этом примере используются имена студентов (тип chararray) и оценки GPA (тип float) для создания трёх карт.

A = load 'students' as (name:chararray, age:int, gpa:float);
B = foreach A generate TOMAP(name, gpa);
store B into 'results';

Input (students)
joe smith 20 3.5
amy chen 22 3.2
leo allen 18 2.1

Output (results)
[joe smith#3.5]
[amy chen#3.2]
[leo allen#2.1]

TOP

Возвращает n лучших кортежей из мешка кортежей.

Синтаксис

TOP(topN,column,relation)

Термины

topN

Количество лучших кортежей для возврата (тип integer).

column

Столбец кортежа, значения которого сравниваются. 0 обозначает первый столбец.

relation

Отношение (мешок кортежей), содержащее столбец кортежа.

Использование

Функция TOP возвращает мешок, содержащий N лучших кортежей из входного мешка, где N задаётся первым параметром функции. Сравнение кортежей выполняется на основе одного столбца кортежа. Позиция столбца определяется вторым параметром функции. Функция предполагает, что все кортежи в мешке содержат элементы одного типа в сравниваемом столбце.

По умолчанию функция TOP использует порядок убывания. Но это можно настроить с помощью оператора DEFINE.

DEFINE asc TOP('ASC'); -- ascending order
DEFINE desc TOP('DESC'); -- descending order

Пример

В этом примере возвращаются 10 самых часто встречающихся элементов.

DEFINE asc TOP('ASC'); -- ascending order
DEFINE desc TOP('DESC'); -- descending order

A = LOAD 'data' as (first: chararray, second: chararray);
B = GROUP A BY (first, second);
C = FOREACH B generate FLATTEN(group), COUNT(A) as count;
D = GROUP C BY first; -- again group by first
topResults = FOREACH D {
    result = asc(10, 1, C); -- and retain top 10 (in ascending order) occurrences of 'second' in first  
    GENERATE FLATTEN(result);
}

bottomResults = FOREACH D {
    result = desc(10, 1, C); -- and retain top 10  (in descending order) occurrences of 'second' in first  
    GENERATE FLATTEN(result);
}

Hive UDF

Pig вызывает все типы Hive UDF, включая UDF, GenericUDF, UDAF, GenericUDAF и GenericUDTF. В зависимости от используемого Hive UDF, необходимо объявить его в Pig с помощью HiveUDF (обрабатывает UDF и GenericUDF), HiveUDAF (обрабатывает UDAF и GenericUDAF), HiveUDTF (обрабатывает GenericUDTF).

Синтаксис

HiveUDF, HiveUDAF, HiveUDTF имеют одинаковый синтаксис.

HiveUDF(name[, constant parameters])

Термины

name

Имя Hive UDF. Это может быть полное имя класса Hive UDF/UDTF/UDAF или зарегистрированное короткое имя в Hive FunctionRegistry (большинство встроенных Hive UDF делает это).

constant parameters

Необязательная кортеж, представляющая постоянные параметры Hive UDF/UDTF/UDAF. Если Hive UDF требует постоянного параметра, Pig не может передать эту информацию в Hive другим способом, так как схема Pig не содержит информации о том, является ли параметр постоянным или нет. Нулевое значение в кортеже означает, что это поле не является постоянным. Не нулевое значение представляет постоянное поле. Тип данных для элемента определяется парсером постоянных значений Pig.

Пример

HiveUDF

define sin HiveUDF('sin');
A = LOAD 'student' as (name:chararray, age:int, gpa:double);
B = foreach A generate sin(gpa);
  

HiveUDTF

define explode HiveUDTF('explode');
A = load 'mydata' as (a0:{(b0:chararray)});
B = foreach A generate flatten(explode(a0));
  

HiveUDAF

define avg HiveUDAF('avg');
A = LOAD 'student' as (name:chararray, age:int, gpa:double);
B = group A by name;
C = foreach B generate group, avg(A.age);
  

HiveUDAF с постоянным параметром

define in_file HiveUDF('in_file', '(null, "names.txt")');
A = load 'student' as (name:chararray, age:long, gpa:double);
B = foreach A generate in_file(name, 'names.txt');

В этом примере мы передаем (null, "names.txt") в конструктор UDF in_file, что означает, что первый параметр обычный, а второй — постоянный. names.txt может быть заключен в двойные кавычки (в отличие от других синтаксических конструкций Pig) или в одинарные кавычки. Обратите внимание, что нам необходимо передать 'names.txt' снова в строке 3. Это может показаться глупым, но нам нужно сделать это, чтобы заполнить семантический разрыв между Pig и Hive. Нам нужно передать постоянное значение в конвейер данных в строке 3, что аналогично Pig UDF. Код инициализации в Hive UDF принимает ObjectInspector, который определяет тип данных и является ли параметр постоянным. Однако код инициализации в Pig принимает схему, которая определяет только первое. Нам необходимо использовать дополнительный механизм (параметр конструктора), чтобы передать последнее.

Примечание: несколько Hive 0.14 UDF содержат ошибку, которая влияет на Pig и исправлена в Hive 1.0. Вот список: compute_stats, context_ngrams, count, ewah_bitmap, histogram_numeric, collect_list, collect_set, ngrams, case, in, named_struct, stack, percentile_approx.

© 2007–2016 Apache Software Foundation
Licensed under the Apache Software License version 2.0.
https://pig.apache.org/docs/r0.16.0/func.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API