Встроенные функции
Введение
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') В настоящее время поддерживаются следующие параметры:
|
Использование
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. Столбцы указываются одним из трех способов, описанных ниже.
|
| 'options' | Строка, содержащая разделенные пробелами параметры ('-optionA=valueA -optionB=valueB -optionC=valueC') В настоящее время поддерживаются следующие параметры:
|
Использование
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 ’) В настоящее время поддерживаются следующие параметры:
|
Использование
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' | Список столбцов через запятую для чтения/записи данных. Каждый из этих столбцов может быть одного из трех типов:
Литеральная запись: это самое простое задание, которое представляет собой строку, разделяемую двоеточием, которая сопоставляется с семейством и квалификатором столбцов. Это читает/записывает простую скалярную величину из/в Accumulo. Префикс семейства столбцов: При чтении это извлекает данные из Accumulo Key-Value в текущей строке, семейство столбцов которых соответствует заданному префиксу. Это приводит к размещению массива в кортеже. При записи также ожидается массив в заданном смещении в кортеже, ключи которого будут добавлены к префиксу семейства столбцов, используется пустой квалификатор столбцов, а значение массива помещается в значение Accumulo. Префикс квалификатора столбцов: аналогично префиксу семейства столбцов, но действует на квалификатор столбцов. При чтении значения Accumulo Key-Value в той же строке, которые соответствуют заданному семейству и префиксу квалификатора столбцов, помещаются в один массив. При записи используется предоставленное семейство столбцов из задания столбцов, ключ массива добавляется к квалификатору столбцов, указанному в задании, и значение массива является значением Accumulo. Если «columns» не указан или является пустой строкой, он обрабатывается эквивалентно «*». Это означает, что при отсутствии задания столбцов, при чтении все столбцы в указанной строке Accumulo помещаются в один массив (при этом ключи массива разделены двоеточием для сохранения семейства/квалификатора столбцов из Accumulo). При записи ключи массива помещаются в семейство столбцов, а квалификатор столбцов будет пустым. |
| 'options' | Строка, содержащая параметры, разделенные пробелами ("optionA valueA -optionB valueB -optionC valueC") В настоящее время поддерживаются следующие параметры:
|
Использование
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 '). Текущие параметры применимы только к операции сохранения, а не к загрузке. В настоящее время поддерживаются следующие параметры:
|
Пример
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