Spec-Zone.ru › Apache Pig 0.17

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

  • Введение
  • Динамические вызыватели
  • Функции вычисления
    • AVG
    • BagToString
    • BagToTuple
    • Bloom
    • CONCAT
    • COUNT
    • COUNT_STAR
    • DIFF
    • IsEmpty
    • MAX
    • MIN
    • PluckTuple
    • SIZE
    • SUBTRACT
    • SUM
    • IN
    • 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
    • REGEX_SEARCH
    • 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 предоставляет набор встроенных функций (функции вычисления, загрузки/сохранения, математические, строковые, функции мешков и кортежей). Два основных свойства отличают встроенные функции от пользовательских функций (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 (например, для обработки результатов группировки ваших наборов данных). Это полезно, но следует учитывать: полученная пользовательская функция не будет оптимизирована для Hadoop, и значительные преимущества, которые вы получаете от реализации интерфейсов Algebraic и Accumulator, будут утеряны. Будьте осторожны, если используете вызыватели таким образом.

Функции вычисления

СРЗНАЧ

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

Синтаксис

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

Термины

выражение

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

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

Функция СРЗНАЧ используется для вычисления среднего значения числовых элементов в одностолбцовом мешке. Для вычисления глобального среднего значения требуется предварительная команда GROUP ALL, а для вычисления среднего значения по группам — команда GROUP BY.

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

Пример

В данном примере вычисляется средний балл GPA для каждого студента (см. оператор 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, если они таковыми не являются.

разделитель

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

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

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

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

Примеры:

vals разделитель BagToString(vals, разделитель) Примечания
{('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

BagToTuple

Развертывание элементов мешка в кортеж.

Синтаксис

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

Термины

выражение

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

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

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

Примеры

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

A = LOAD 'bag_data' AS (B1:bag{T1:tuple(f1:chararray)});

DUMP A;
({('a'),('b'),('c')})
({('d'),('e'),('f')})

X = FOREACH A GENERATE BagToTuple(B1);

DUMP X;
(('a','b','c'))
(('d','e','f'))

В этом примере мешок, содержащий кортежи с двумя полями, преобразуется в кортеж.

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

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

X = FOREACH A GENERATE BagToTuple(B1);

DUMP X;
((4,1,7,8,4,9))
((5,8,4,3,3,8))

Bloom

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

Синтаксис

BuildBloom(Тип хэширования, Режим, Размер вектора, Кол-во хэшей)

Bloom(Имя файла)

Термины

тип хэширования

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

режим

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

размер вектора

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

кол-во хэшей

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

имя файла

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

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

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

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

Реализация использует внутренне блокирующие фильтры 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 для вычисления количества элементов в мешке. Для вычисления глобального количества требуется предшествующая команда 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(expression)

Термины

expression

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

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

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

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

Пример

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

X = FOREACH B GENERATE COUNT_STAR(A);

DIFF

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

Синтаксис

DIFF (expression, expression)

Термины

expression

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

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

Функция 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(expression)

Термины

expression

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

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

Функция 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(expression)

Термины

expression

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

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

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

Функция MAX игнорирует NULL-значения.

Пример

В этом примере вычисляется максимальный 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(expression)

Термины

expression

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

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

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

Функция MIN игнорирует NULL-значения.

Пример

В этом примере вычисляется минимальный 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(expression1)

DEFINE pluck PluckTuple(expression1,expression3)

pluck(expression2)

Термины

expression1

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

expression2

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

expression3

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

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

Пример:

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(expression)

Термины

expression

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

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

Используйте функцию SIZE для вычисления количества элементов на основе типа данных (см. таблицы типов ниже). SIZE включает NULL-значения в вычислении размера. 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(bag1, bag2) = мешки, состоящие из элементов bag1, отсутствующих в bag2

Синтаксис

SUBTRACT(expression, expression)

Термины

expression

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

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

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 требует предваряющего оператора GROUP ALL для глобальных сумм и оператора GROUP BY для групповых сумм.

Синтаксис

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

Термины

выражение

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

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

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

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

Пример

В этом примере вычисляется количество питомцев. (см. оператор 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

В

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

Синтаксис

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

Термины

выражение

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

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

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

Пример

В этом примере мы отфильтровываем ID 4 и 6.

A = load 'data' using PigStorage(',') AS (id:int, first:chararray, last:chararray, gender:chararray);

DUMP A;
(1,Christine,Romero,Female)
(2,Sara,Hansen,Female)
(3,Albert,Rogers,Male)
(4,Kimberly,Morrison,Female)
(5,Eugene,Baker,Male)
(6,Ann,Alexander,Female)
(7,Kathleen,Reed,Female)
(8,Todd,Scott,Male)
(9,Sharon,Mccoy,Female)
(10,Evelyn,Rice,Female)

X = FILTER A BY id IN (4, 6);
DUMP X;
(4,Kimberly,Morrison,Female)
(6,Ann,Alexander,Female)

В этом примере мы передаём BigInteger и используем оператор NOT, тем самым отрицая переданный список полей в условии IN.

A = load 'data' using PigStorage(',') AS (id:biginteger, first:chararray, last:chararray, gender:chararray); 
X = FILTER A BY NOT id IN (1, 3, 5, 7, 9); 
DUMP X;
 
(2,Sara,Hansen,Female)
(4,Kimberly,Morrison,Female)
(6,Ann,Alexander,Female)
(8,Todd,Scott,Male)
(10,Evelyn,Rice,Female)

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 GENERATE TOKENIZE (f1,'||');
DUMP B;
{code} 

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

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

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

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

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

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()

Термины

none

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

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

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;

Существует проблема с такой последовательностью событий. Первый скрипт не определяет типы данных и, в результате, данные сохраняются как bytearray и bag с кортежем, содержащим два bytearray. Второй скрипт пытается преобразовать bytearray в double; однако, поскольку данные произошли от другого лоадера, он не может узнать формат bytearray или как преобразовать его в другой тип. Для решения этой проблемы 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( ['schema'] )

JsonStorage( )

Термины

schema

Необязательная схема 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()

Термины

none

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

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

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

Пример

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

STORE X INTO 'output' USING PigDump();

PigStorage

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

Синтаксис

PigStorage( [field_delimiter] , ['options'] )

Термины

field_delimiter

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

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

'options'

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

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

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

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

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

Заявления загрузки/сохранения

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

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

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

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

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

Схемы

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

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

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

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

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

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

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

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

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

  • Кортеж: заключён в (), элементы разделены запятыми
    • Непустой кортеж: (item1,item2,item3)
    • Пустой кортеж допустим: ()
  • Множество: заключено в {}, кортежи разделены запятыми
    • Непустое множество: {code}{(tuple1),(tuple2),(tuple3)}{code}
    • Пустое множество допустимо: {}
  • Словарь: заключено в [], элементы разделены запятыми, ключ и значение разделены "#"
    • Непустой словарь: [key1#value1,key2#value2]
    • Пустой словарь допустим: []

Если в заявлении загрузки указана схема, Pig преобразует сложный тип в соответствии со схемой. Если преобразование завершится неудачей, соответствующий элемент будет null (см. Null и 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 загружает данные со сложным типом данных, множеством словарей и double.

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

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

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

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

В этом примере 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'])

Термины

schema

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

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

record name

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

'options'

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

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

  • -namespace nameSpace or -n nameSpace Явно указать поле namespace в записях Avro при сохранении данных
  • -schemfile schemaFile or -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 or -e exampleFile Указать входную (или выходную) схему, используя другой файл Avro в качестве примера. Pig предполагает, что файл находится в файловой системе по умолчанию, но вы можете использовать и явную URL-адрес для указания расположения. Pig ожидает, что это будет файл данных Avro.
  • -allowrecursive or -r Указать, разрешить ли определения рекурсивных схем (по умолчанию — выбросить исключение, если Pig встретит рекурсивную схему). При чтении объектов с рекурсивными определениями Pig будет переводить записи Avro в кортежи без схемы; схема Pig для объекта может не совпадать с данными точно.
  • -doublecolons or -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, а столбцы в этой строке могут быть сгруппированы различными статическими или с подстановочными знаками способами. Существует базовая функциональность подстановки для группирования различных семейств/квалификаторов столбцов в массив для операций LOAD или сериализации массива в группу семейств/квалификаторов столбцов при операциях STORE.

Синтаксис

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

Аргументы

'columns'

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

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

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

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

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

Если «columns» не указан или является пустой строкой, он обрабатывается эквивалентно «*». Это означает, что при отсутствии задания столбцов, при чтении все столбцы в указанной строке Accumulo помещаются в один массив (при этом ключи массива разделены двоеточием для сохранения семейства/квалификатора столбцов из Accumulo). При записи ключи массива помещаются в семейство столбцов, а квалификатор столбцов будет пустым.

'options'

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

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

  • (-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 на пути к классам есть Accumulo JAR-файлы. Это легко достигается с помощью переменной окружения 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». В этом примере ключ строки, который представляет собой уникальный код аэропорта, назначается переменной «code», а все остальные столбцы помещаются в карту. Когда квалификатор столбца не пустой, ключ в этой карте будет содержать двоеточие, которое разделяет часть ключа из семейства столбцов и часть из квалификатора столбца. Значение 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 '). Текущие параметры применимы только к операции сохранения, а не к загрузке.

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

  • --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

Необязательное целое число, определяющее режим округления, в соответствии с константами, предоставляемыми 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

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(string, testAgainst)

Термины

string

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

testAgainst

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

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

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

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

EqualsIgnoreCase

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

Синтаксис

EqualsIgnoreCase(string1, string2)

Термины

string1

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

string2

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

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

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

INDEXOF

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

Синтаксис

INDEXOF(string, 'character', startIndex)

Термины

string

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

'character'

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

startIndex

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

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

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

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

LAST_INDEX_OF

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

Синтаксис

LAST_INDEX_OF(string, 'character')

Термины

string

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

'character'

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

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

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

LCFIRST

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

Синтаксис

LCFIRST(expression)

Термины

expression

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

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

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

LOWER

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

Синтаксис

LOWER(expression)

Термины

expression

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

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

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

LTRIM

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

Синтаксис

LTRIM(expression)

Термины

expression

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

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

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

REGEX_EXTRACT

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

Синтаксис

REGEX_EXTRACT (string, regex, index)

Термины

string

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

regex

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

index

Индекс совпадающей группы для возврата.

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

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

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

Пример

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

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

REGEX_EXTRACT_ALL

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

Синтаксис

REGEX_EXTRACT_ALL (string, regex)

Термины

string

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

regex

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

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

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

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

Пример

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

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

REGEX_SEARCH

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

Синтаксис

REGEX_SEARCH(string, 'regExp');

Термины

string

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

'regExp'

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

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

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

Функция возвращает кортежи, которые помещаются в набор. Каждый кортеж содержит только одно поле, представляющее совпадающее выражение.

Пример

Этот пример вернёт набор {(=04 ),(=06 ),(=96 )}.

REGEX_SEARCH('a=04 b=06 c=96 or more', '(=\\d+\\s)');

А этот пример вернёт набор {(04),(06),(96)}.

REGEX_SEARCH('a=04 b=06 c=96 or more', '=(\\d+)\\s');

REPLACE

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

Синтаксис

REPLACE(string, 'regExp', 'newChar');

Термины

string

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

'regExp'

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

'newChar'

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

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

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

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

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

RTRIM

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

Синтаксис

RTRIM(expression)

Термины

expression

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

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

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

SPRINTF

Форматирует набор значений в соответствии с шаблоном в стиле printf, используя библиотеку родного 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 -> строка).

(нулевое значение)

1234567

1234567

'yay'

(нулевое значение)

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

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

1234567

(нулевое значение)

'yay'

(нулевое значение)

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

'%8.3f|%6x'

123.14159

665568

' 123.142| a27e0'

Форматирование чисел с плавающей точкой/double с %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 для элементов даты/времени, от него лучше отказаться: он неудобен, вывод и обработка часового пояса могут отличаться от ожидаемого, и он не принимает объекты datetime из pig. Вместо этого просто подготовьте даты, используя UDF ToString, как показано.

STARTSWITH

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

Синтаксис

STARTSWITH(строка, сравниватьСо)

Термины

строка

Строка, подлежащая проверке.

сравниватьСо

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

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

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

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

STRSPLIT

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

Синтаксис

STRSPLIT(строка, regex, лимит)

Термины

строка

Строка, подлежащая разделению.

regex

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

лимит

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

Если значение отрицательное, лимит для длины кортежа результата не применяется.

Если значение равно нулю, лимит для длины кортежа результата также не применяется, и пустые строки в конце (если таковые имеются) будут удалены.

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

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

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

STRSPLITTOBAG

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

Синтаксис

STRSPLITTOBAG(строка, regex, лимит)

Термины

строка

Строка, подлежащая разделению.

regex

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

лимит

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

Если значение отрицательное, лимит размера пакета результата не применяется.

Если значение равно нулю, лимит размера пакета результата также не применяется, и пустые строки в конце (если таковые имеются) будут удалены.

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

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

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

SUBSTRING

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

Синтаксис

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

Термины

string

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

startIndex

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

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

stopIndex

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

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

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

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

TRIM

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

Синтаксис

TRIM(expression)

Термины

expression

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

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

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

UCFIRST

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

Синтаксис

UCFIRST(expression)

Термины

expression

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

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

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

UPPER

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

Синтаксис

UPPER(expression)

Термины

expression

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

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

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

UniqueID

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

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

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

Функции даты и времени

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

AddDuration

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

Синтаксис

AddDuration(datetime, duration)

Термины

datetime

Объект datetime.

duration

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

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

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

CurrentTime

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

Синтаксис

CurrentTime()

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

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

DaysBetween

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

Синтаксис

DaysBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

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

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

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

GetDay

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

Синтаксис

GetDay(datetime)

Термины

datetime

Объект datetime.

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

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

GetHour

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

Синтаксис

GetHour(datetime)

Термины

datetime

Объект datetime.

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

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

GetMilliSecond

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

Синтаксис

GetMilliSecond(datetime)

Термины

datetime

Объект datetime.

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

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

GetMinute

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

Синтаксис

GetMinute(datetime)

Термины

datetime

Объект datetime.

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

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

GetMonth

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

Синтаксис

GetMonth(datetime)

Термины

datetime

Объект datetime.

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

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

GetSecond

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

Синтаксис

GetSecond(datetime)

Термины

datetime

Объект datetime.

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

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

GetWeek

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

Синтаксис

GetWeek(datetime)

Термины

datetime

Объект datetime.

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

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

GetWeekYear

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

Синтаксис

GetWeekYear(datetime)

Термины

datetime

Объект datetime.

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

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

GetYear

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

Синтаксис

GetYear(datetime)

Термины

datetime

Объект datetime.

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

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

HoursBetween

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

Синтаксис

HoursBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

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

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

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

MilliSecondsBetween

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

Синтаксис

MilliSecondsBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

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

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

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

MinutesBetween

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

Синтаксис

MinutesBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

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

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

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

MonthsBetween

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

Синтаксис

MonthsBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

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

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

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

SecondsBetween

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

Синтаксис

SecondsBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

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

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

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

SubtractDuration

Возвращает результат объекта 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 или параметром timezone, будет использован по умолчанию.

ToMilliSeconds

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

Синтаксис

ToMilliSeconds(datetime)

Термины

datetime

Объект datetime.

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

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

ToString

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

Синтаксис

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

Термины

datetime

Объект datetime.

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

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

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

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

ToUnixTime

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

Синтаксис

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 для преобразования пар выражений в словарь. Обратите внимание на следующее:

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

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

Пример

В этом примере имена студентов (тип chararray) и оценки студентов (тип 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

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

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 (большинство встроенных UDF Hive делают это)

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–2017 Apache Software Foundation
Licensed under the Apache Software License version 2.0.
https://pig.apache.org/docs/r0.17.0/func.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API