Встроенные функции
Введение
Pig поставляется с набором встроенных функций (функции eval, загрузки/хранения, математические, строковые, функций для мешков и кортежей). Два основных свойства отличают встроенные функции от пользовательских функций (UDFs). Во-первых, встроенные функции не нужно регистрировать, потому что Pig знает, где они находятся. Во-вторых, встроенные функции не нужно квалифицировать при использовании, потому что Pig знает, где их найти.
Динамические вызывающие функции
Часто вам может понадобиться использовать простую функцию, уже предоставляемую стандартными Java-библиотеками, но для которой не было написано пользовательской функции (UDF). Динамические вызывающие функции позволяют вам ссылаться на Java-функции без необходимости заключать их в пользовательские UDF, но при этом выполняют Java-рефлексию при каждом вызове функции.
...
DEFINE UrlDecode InvokeForString('java.net.URLDecoder.decode', 'String String');
encoded_strings = LOAD 'encoded_strings.txt' as (encoded:chararray);
decoded_strings = FOREACH encoded_strings GENERATE UrlDecode(encoded, 'UTF-8');
...
В настоящее время динамические вызывающие функции могут использоваться для любой статической функции, которая:
- Не принимает аргументов или принимает некоторую комбинацию строк, целых чисел, длинных целых чисел, двойных, плавающих или массивов с этими же типами
- Возвращает строку, целое число, длинное целое число, двойное или плавающее число
Для чисел могут использоваться только примитивные типы; не могут использоваться числовые классы с заглавной буквой в качестве аргументов. В зависимости от типа возвращаемого значения должна использоваться определённая разновидность вызывающей функции: InvokeForString, InvokeForInt, InvokeForLong, InvokeForDouble или InvokeForFloat.
Для привязки ключевого слова к Java-методу используется оператор DEFINE, как показано выше. Первый аргумент конструктора InvokeFor* — это полный путь к нужному методу. Второй аргумент — это упорядоченный список классов аргументов метода, разделённых пробелами. Этот аргумент можно опустить или указать пустую строку, если метод не принимает аргументов. Допустимые имена классов — string, long, float, double и int. Вызывающие функции также могут работать с аргументами массивов, представленными в Pig в виде DataBags элементов одиночного кортежа. Например, просто укажите string[]. Имена классов не чувствительны к регистру.
Возможность использования вызывающих функций с аргументами массивов делает доступными такие методы, как те, что находятся в org.apache.commons.math.stat.StatUtils (например, для обработки результатов группирования наборов данных). Это полезно, но следует учесть: полученная пользовательская функция не будет оптимизирована для Hadoop, и значительные преимущества, получаемые от реализации интерфейсов Algebraic и Accumulator, будут утрачены. Будьте осторожны, если вы используете вызывающие функции таким образом.
Функции Eval
СРЗНАЧ
Вычисляет среднее арифметическое числовых значений в одностолбцовой выборке.
Синтаксис
| СРЗНАЧ(выражение) |
Термины
| выражение | Любое выражение, результат которого является выборкой. Элементы выборки должны быть типа 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 | |
| СРЗНАЧ | long | long | double | double | bigdecimal * | bigdecimal * | ошибка | преобразование в double |
* Средние значения для типов bigdecimal и biginteger имеют точность, заданную java.math.MathContext.DECIMAL128.
BagToString
Объединяет элементы выборки в строку типа chararray, помещая необязательный разделитель между каждым значением.
Синтаксис
| BagToString(vals:bag [, delimiter:chararray]) |
Термины
| vals | Выборка произвольных значений. Они будут преобразованы в chararray, если таковыми не являются. |
| delimiter | Значение chararray, которое будет помещено между элементами выборки; по умолчанию – символ подчёркивания '_'. |
Использование
BagToString создаёт одну строку из элементов выборки, аналогично функции GROUP_CONCAT SQL. Учтите следующее:
- Выборка может иметь произвольный размер, в то время как строки в Java не могут: вы либо исчерпаете доступную память, либо превысите максимальное количество символов (примерно 2 миллиарда). Одной из худших характеристик производственного задания является пороговое поведение: всё будет казаться почти хорошо, пока размер данных вашей большей выборки не вырастет с почти-слишком-большого до едва-слишком-большого.
- Выборка не упорядочена, если вы явно не примените вложенную операцию ORDER BY, как показано ниже. Вложенный FOREACH сохранит порядок, позволяя вам упорядочить по одному набору полей, затем вывести только те значения, которые вы хотите объединить.
- По умолчанию применяется преобразование каждого элемента в строку. Если элементы выборки не являются атомами (кортежи, карты и т.д.), это может не быть желаемым результатом. Используйте вложенный FOREACH для форматирования значений, а затем объедините их с BagToString, как показано ниже
Примеры:
| vals | delimiter | BagToString(vals, delimiter) | Примечания |
|---|---|---|---|
| {('BOS'),('NYA'),('BAL')} | BOS_NYA_BAL | Если указан только один аргумент, поле разделяются символами подчёркивания | |
| {('BOS'),('NYA'),('BAL')} | '|' | BOS|NYA|BAL | Но вы можете указать свой собственный разделитель |
| {('BOS'),('NYA'),('BAL')} | '' | BOSNYABAL | Используйте явную пустую строку, чтобы просто склеить всё вместе |
| {(1),(2),(3)} | '|' | 1|2|3 | Элементы преобразуются в соответствующие типы |
Примеры
Простые строки с разделителями простые:
team_parks = LOAD 'team_parks' AS (team_id:chararray, park_id:chararray, years:bag{(year_id:int)});
-- BOS BOS07 {(1995),(1997),(1996),(1998),(1999)}
-- NYA NYC16 {(1995),(1999),(1998),(1997),(1996)}
-- NYA NYC17 {(1998)}
-- SDN HON01 {(1997)}
-- SDN MNT01 {(1996),(1999)}
-- SDN SAN01 {(1999),(1997),(1998),(1995),(1996)}
team_parkslist = FOREACH (GROUP team_parks BY team_id) GENERATE
group AS team_id, BagToString(team_parks.park_id, ';');
-- BOS BOS07
-- NYA NYC17;NYC16
-- SDN SAN01;MNT01;HON01
Обработка сложных элементов по умолчанию работает, но, вероятно, не то, что вам нужно.
team_parkyearsugly = FOREACH (GROUP team_parks BY team_id) GENERATE
group AS team_id,
BagToString(team_parks.(park_id, years));
-- BOS BOS07_{(1995),(1997),(1996),(1998),(1999)}
-- NYA NYC17_{(1998)}_NYC16_{(1995),(1999),(1998),(1997),(1996)}
-- SDN SAN01_{(1999),(1997),(1998),(1995),(1996)}_MNT01_{(1996),(1999)}_HON01_{(1997)}
Вместо этого, соберите её частями. На шаге 2 мы сортируем по одному полю, но обрабатываем другое; она остаётся в отсортированном порядке.
team_park_yearslist = FOREACH team_parks {
years_o = ORDER years BY year_id;
GENERATE team_id, park_id, SIZE(years_o) AS n_years, BagToString(years_o, '/') AS yearslist;
};
team_parkyearslist = FOREACH (GROUP team_park_yearslist BY team_id) {
tpy_o = ORDER team_park_yearslist BY n_years DESC, park_id ASC;
tpy_f = FOREACH tpy_o GENERATE CONCAT(park_id, ':', yearslist);
GENERATE group AS team_id, BagToString(tpy_f, ';');
};
-- BOS BOS07:1995/1996/1997/1998/1999
-- NYA NYC16:1995/1996/1997/1998/1999;NYC17:1998
-- SDN SAN01:1995/1996/1997/1998/1999;MNT01:1996/1999;HON01:1997
CONCAT
Объединяет два или более выражений одного и того же типа.
Синтаксис
| CONCAT (выражение, выражение, [...выражение]) |
Термины
| выражение | Любое выражение. |
Использование
Используйте функцию CONCAT для объединения двух или более выражений. Результаты выражений должны иметь одинаковые типы.
Если какое-либо подвыражение равно NULL, результирующее выражение равно NULL.
Пример
В этом примере объединяются поля f1, строковая константа с символом подчёркивания, f2 и f3.
A = LOAD 'data' as (f1:chararray, f2:chararray, f3:chararray); DUMP A; (apache,open,source) (hadoop,map,reduce) (pig,pig,latin) X = FOREACH A GENERATE CONCAT(f1, '_', f2,f3); DUMP X; (apache_opensource) (hadoop_mapreduce) (pig_piglatin)
COUNT
Вычисляет количество элементов в выборке.
Синтаксис
| COUNT(выражение) |
Термины
| выражение | Выражение типа выборка. |
Использование
Используйте функцию COUNT для вычисления количества элементов в выборке. COUNT требует предшествующего оператора GROUP ALL для глобальных подсчётов и оператора GROUP BY для подсчётов по группам.
Функция COUNT следует синтаксическим правилам и игнорирует значения NULL. Это означает, что кортеж в выборке не будет посчитан, если ПЕРВОЕ ПОЛЕ в этом кортеже равно NULL. Если вы хотите включить значения NULL в вычисление подсчёта, используйте COUNT_STAR.
Примечание: Вы не можете использовать обозначение кортежа (*) с COUNT; то есть COUNT(*) не будет работать.
Пример
В этом примере подсчитываются кортежи в выборке (см. оператор GROUP для получения информации о именах полей в отношении B).
A = LOAD 'data' AS (f1:int,f2:int,f3:int);
DUMP A;
(1,2,3)
(4,2,1)
(8,3,4)
(4,3,3)
(7,2,5)
(8,4,3)
B = GROUP A BY f1;
DUMP B;
(1,{(1,2,3)})
(4,{(4,2,1),(4,3,3)})
(7,{(7,2,5)})
(8,{(8,3,4),(8,4,3)})
X = FOREACH B GENERATE COUNT(A);
DUMP X;
(1L)
(2L)
(1L)
(2L)
Типы таблиц
| int | long | float | double | chararray | bytearray | |
| COUNT | long | long | long | long | long | long |
COUNT_STAR
Вычисляет количество элементов в выборке.
Синтаксис
| COUNT_STAR(выражение) |
Термины
| выражение | Выражение типа выборка. |
Использование
Используйте функцию COUNT_STAR для вычисления количества элементов в выборке. COUNT_STAR требует предшествующего оператора GROUP ALL для глобальных подсчётов и оператора GROUP BY для подсчётов по группам.
COUNT_STAR включает значения NULL в вычисление подсчёта (в отличие от COUNT, которая игнорирует значения NULL).
Пример
В этом примере COUNT_STAR используется для подсчёта кортежей в выборке.
X = FOREACH B GENERATE COUNT_STAR(A);
DIFF
Сравнивает два поля в кортеже.
Синтаксис
| DIFF (выражение, выражение) |
Термины
| выражение | Выражение любого типа данных. |
Использование
Функция DIFF принимает две выборки в качестве аргументов и сравнивает их. Любые кортежи, которые присутствуют в одной выборке, но отсутствуют в другой, возвращаются в выборке. Если выборки совпадают, возвращается пустая выборка. Если поля не являются выборками, они будут заключены в кортежи и возвращены в выборке, если они не совпадают, или будет возвращена пустая выборка, если два записи совпадают. Реализация предполагает, что обе выборки, передаваемые в функцию DIFF, целиком помещаются в память одновременно. Если это не так, UDF всё равно будет работать, но очень медленно.
Пример
В этом примере DIFF сравнивает кортежи в двух выборках.
A = LOAD 'bag_data' AS (B1:bag{T1:tuple(t1:int,t2:int)},B2:bag{T2:tuple(f1:int,f2:int)});
DUMP A;
({(8,9),(0,1)},{(8,9),(1,1)})
({(2,3),(4,5)},{(2,3),(4,5)})
({(6,7),(3,7)},{(2,2),(3,7)})
DESCRIBE A;
a: {B1: {T1: (t1: int,t2: int)},B2: {T2: (f1: int,f2: int)}}
X = FOREACH A GENERATE DIFF(B1,B2);
grunt> dump x;
({(0,1),(1,1)})
({})
({(6,7),(2,2)})
IsEmpty
Проверяет, является ли выборка или карта пустой.
Синтаксис
| IsEmpty(выражение) |
Термины
| выражение | Выражение любого типа данных. |
Использование
Функция IsEmpty проверяет, пуста ли выборка или карта (не содержит данных). Функция может быть использована для фильтрации данных.
Пример
В этом примере находятся все студенты с SSN, но без имени.
SSN = load 'ssn.txt' using PigStorage() as (ssn:long); SSN_NAME = load 'students.txt' using PigStorage() as (ssn:long, name:chararray); /* do a left outer join of SSN with SSN_Name */ X = JOIN SSN by ssn LEFT OUTER, SSN_NAME by ssn; /* only keep those ssn's for which there is no name */ Y = filter X by IsEmpty(SSN_NAME);
MAX
Вычисляет максимальное значение числовых значений или chararray в мешке с одним столбцом. MAX требует предшествующего оператора GROUP ALL для глобальных максимумов и оператора GROUP BY для групповых максимумов.
Синтаксис
| MAX(выражение) |
Термины
| выражение | Выражение с типами данных int, long, float, double, bigdecimal, biginteger, chararray, datetime или bytearray. |
Использование
Используйте функцию MAX для вычисления максимального значения числовых значений или chararray в мешке с одним столбцом.
Функция MAX игнорирует значения 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(выражение) |
Термины
| выражение | Выражение с типами данных 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(выражение1) DEFINE pluck PluckTuple(выражение1,выражение3) pluck(выражение2) |
Термины
| выражение1 | Префикс для извлечения или шаблон регулярных выражений для извлечения |
| выражение2 | Поля, к которым применяется извлечение, обычно «*» |
| выражение3 | Логический флаг, указывающий, следует ли включать или исключать соответствующие столбцы |
Использование
Пример:
a = load 'a' as (x, y);
b = load 'b' as (x, y);
c = join a by x, b by x;
DEFINE pluck PluckTuple('a::');
d = foreach c generate FLATTEN(pluck(*));
describe c;
c: {a::x: bytearray,a::y: bytearray,b::x: bytearray,b::y: bytearray}
describe d;
d: {plucked::a::x: bytearray,plucked::a::y: bytearray}
DEFINE pluckNegative PluckTuple('a::','false');
d = foreach c generate FLATTEN(pluckNegative(*));
describe d;
d: {plucked::b::x: bytearray,plucked::b::y: bytearray}
SIZE
Вычисляет количество элементов на основе любого типа данных Pig.
Синтаксис
| SIZE(выражение) |
Термины
| выражение | Выражение с любым типом данных. |
Использование
Используйте функцию SIZE для вычисления количества элементов на основе типа данных (см. таблицы типов ниже). SIZE включает значения 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 | возвращает количество пар ключ/значение в map |
SUBTRACT
Вычитание мешков, SUBTRACT(bag1, bag2) = мешки, составленные из элементов bag1, отсутствующих в bag2
Синтаксис
| SUBTRACT(выражение, выражение) |
Термины
| выражение | Выражение с типом данных bag. |
Использование
SUBTRACT принимает два мешка в качестве аргументов и возвращает новый мешок, составленный из кортежей первого мешка, которые отсутствуют во втором мешке.
Если null, аргументы мешка заменяются пустыми мешками.
Если аргументы не являются мешками, возникает исключение IOException.
Реализация предполагает, что оба мешка, передаваемые функции SUBTRACT, полностью помещаются в память одновременно. Если это не так, SUBTRACT все равно будет работать, но будет очень медленным.
Пример
В этом примере SUBTRACT создает новый мешок, составленный из элементов B1, которых нет в B2.
A = LOAD 'bag_data' AS (B1:bag{T1:tuple(t1:int,t2:int)},B2:bag{T2:tuple(f1:int,f2:int)});
DUMP A;
({(8,9),(0,1),(1,2)},{(8,9),(1,1)})
({(2,3),(4,5)},{(2,3),(4,5)})
({(6,7),(3,7),(3,7)},{(2,2),(3,7)})
DESCRIBE A;
A: {B1: {T1: (t1: int,t2: int)},B2: {T2: (f1: int,f2: int)}}
X = FOREACH A GENERATE SUBTRACT(B1,B2);
DUMP X;
({(0,1),(1,2)})
({})
({(6,7)})
SUM
Вычисляет сумму числовых значений в мешке с одним столбцом. SUM требует предшествующего оператора GROUP ALL для глобальных сумм и оператора GROUP BY для групповых сумм.
Синтаксис
| SUM(выражение) |
Термины
| выражение | Выражение с типами данных int, long, float, double, bigdecimal, biginteger или bytearray, приведенный к типу double. |
Использование
Используйте функцию SUM для вычисления суммы набора числовых значений в мешке с одним столбцом.
Функция SUM игнорирует значения 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 |
TOKENIZE
Разделяет строку и выводит мешок слов.
Синтаксис
| TOKENIZE(выражение [, 'разделитель_полей']) |
Термины
| выражение | Выражение с типом данных chararray. |
| 'разделитель_полей' | Необязательный разделитель полей (в одинарных кавычках). Если разделитель_полей равен null или не передан, будут использованы следующие разделители: пробел [ ], двойная кавычка [ " ], запятая [ , ], скобки [ () ], звездочка [ * ]. |
Использование
Используйте функцию TOKENIZE для разделения строки слов (все слова в одном кортеже) на мешок слов (каждое слово в отдельном кортеже).
Пример
В этом примере строки в каждой строке разделяются.
A = LOAD 'data' AS (f1:chararray);
DUMP A;
(Here is the first string.)
(Here is the second string.)
(Here is the third string.)
X = FOREACH A GENERATE TOKENIZE(f1);
DUMP X;
({(Here),(is),(the),(first),(string.)})
({(Here),(is),(the),(second),(string.)})
({(Here),(is),(the),(third),(string.)})
В этом примере указан разделитель полей.
{code}
A = LOAD 'data' AS (f1:chararray);
B = FOREACH A TOKENIZE (f1,'||');
DUMP B;
{code}
Функции загрузки/хранения
Функции загрузки/хранения определяют, как данные попадают в Pig и выводятся из Pig. Pig предоставляет набор встроенных функций загрузки/хранения, описанных в разделах ниже. Вы также можете написать собственные функции загрузки/хранения (см. Пользовательские функции).
Обработка сжатия
Поддержка сжатия определяется функцией загрузки/хранения. PigStorage и TextLoader поддерживают сжатие gzip и bzip как для чтения (загрузки), так и для записи (хранения). BinStorage не поддерживает сжатие.
Для работы со сжатыми gzip файлами входные/выходные файлы должны иметь расширение .gz. Сжатые gzip файлы не могут быть разделены между несколькими картами; это означает, что количество созданных карт равно количеству фрагментов файлов во входном расположении.
A = load 'myinput.gz'; store A into 'myoutput.gz';
Для работы со сжатыми bzip файлами входные/выходные файлы должны иметь расширение .bz или .bz2. Поскольку сжатие является блочным, файлы bzip могут быть разделены между несколькими картами.
A = load 'myinput.bz'; store A into 'myoutput.bz';
Примечание: PigStorage и TextLoader правильно считывают сжатые файлы, если они НЕ ЯВЛЯЮТСЯ ФАЙЛАМИ-КОНКАТЕНАЦИЯМИ, сгенерированными таким образом:
-
cat *.gz > text/concat.gz
-
cat *.bz > text/concat.bz
-
cat *.bz2 > text/concat.bz2
Если вы используете файлы-конкатенации gzip или 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;
Есть проблема с этой последовательностью событий. Первый скрипт не определяет типы данных, и, как следствие, данные хранятся как массив байтов и мешок с кортежем, содержащим два массива байтов. Второй скрипт пытается преобразовать массив байтов в double; однако, так как данные произошли от другого загрузчика, у него нет возможности узнать формат массива байтов или как преобразовать его в другой тип. Для решения этой проблемы 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, должны быть представлены в Юникоде (\u0001), используя кодировку UTF-16 (см. Википедию 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)
- Пустой кортеж допустим: ()
- Мешок: заключён в {}, кортежи разделены запятыми
- Непустой мешок: {(tuple1),(tuple2),(tuple3)}
- Пустой мешок допустим: {}
- Словарь: заключён в [], элементы разделены запятыми, ключ и значение разделены «#»
- Непустой словарь: [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. Третье указание tags:work_* запрашивает набор столбцов в семействе столбцов tags, начинающихся с "work_". В таблице HBase может быть ноль, один или несколько столбцов такого типа. Тип указан как tags_map:map[]. Это означает, что набор возвращаемых значений столбцов будет доступен как карта, где ключ — имя столбца, а значение — значение ячейки столбца. Четвёртое указание столбцов также представляет собой карту описаний столбцов к значениям ячеек.
Когда тип столбца в предложении "AS" указан как карта, ключами карты являются имена описаний столбцов, а тип данных — chararray. Тип данных значений столбцов может быть явно объявлен, как показано в примерах ниже:
- tags_map[chararray] - В этом случае все значения столбцов объявлены как chararray
- tags_map[int] - В этом случае все значения столбцов объявлены как int.
Пример сохранения
В этом примере HBaseStorage используется для сохранения отношения в HBase.
A = LOAD 'hdfs_users' AS (id:bytearray, first_name:chararray, last_name:chararray);
STORE A INTO 'hbase://users_table' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage(
'info:first_name info:last_name');
В примере выше отношение A загружается из HDFS и сохраняется в HBase. Обратите внимание, что схема отношения A является кортежем размера 3, но в конструктор HBaseStorage передаются только два имени описаний столбцов. Это связано с тем, что первый элемент кортежа используется в качестве ключа строки HBase.
AvroStorage
Загружает и сохраняет данные из файлов Avro.
Синтаксис
| AvroStorage(['schema|record name'], ['options']) |
Термины
| схема | Строка JSON, определяющая схему Avro для ввода. Вы можете указать явную схему при сохранении или при загрузке данных. Когда вы вручную предоставляете схему, Pig будет использовать предоставленную схему для сериализации и десериализации. Это означает, что вы можете предоставить явную схему при сохранении данных, чтобы упростить вывод (например, удалив необязательные союзы) или переименовать поля. Это также означает, что вы можете предоставить явную схему при чтении данных, чтобы прочитать только подмножество полей в каждом элементе записи. См. документацию Apache Avro для получения дополнительной информации о том, как указать допустимую схему. |
| имя записи | При сохранении мешка кортежей с 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 будет преобразована в объединение записи Avro с эквивалентной схемой и значением null. |
| Множества кортежей | bag | Схема кортежа Pig будет преобразована в объединение массива записей с эквивалентной схемой и значением null. |
| Словари | map | Схема кортежа Pig будет преобразована в объединение словаря записей с эквивалентной схемой и значением 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. Подробное описание аргументов для TrevniStorage см. в разделе AvroStorage.
AccumuloStorage
Загружает или сохраняет данные из таблицы Accumulo. Первый элемент в кортеже эквивалентен "строке" из ключа Accumulo, а столбцы в этой строке могут быть сгруппированы различными статическими или подстановочными способами. Существует базовая функциональность подстановки для группировки различных семейств/квалификаторов столбцов в словарь для LOAD или сериализации словаря в группу семейств/квалификаторов столбцов при STORE.
Синтаксис
| AccumuloStorage(['columns'[, 'options']]) |
Аргументы
| 'columns' | Список столбцов, разделенных запятыми, для чтения и записи данных. Каждый из этих столбцов может быть одного из трех типов:
Литерал: это наиболее простое указание, которое представляет собой строку, разделенную двоеточием, отображающую семейство и квалификатор столбцов. Это будет читать/записывать скалярное значение из/в Accumulo. Префикс семейства столбцов: при чтении данных это извлечет данные из значений ключа-значения Accumulo в текущей строке, семейства столбцов которых соответствуют заданному префиксу. Это приведет к размещению словаря в кортеже. При записи данных также ожидается словарь в заданном смещении кортежа, ключи которого будут добавлены к префиксу семейства столбцов, используется пустой квалификатор столбца, и значение словаря будет помещено в значение Accumulo. Префикс квалификатора столбцов: аналогично префиксу семейства столбцов, но работает с квалификатором столбца. При чтении значения ключа-значения Accumulo в той же строке, которые соответствуют заданному семейству столбцов и префиксу квалификатора столбца, будут помещены в один словарь. При записи данных будет использоваться семейство столбцов из спецификации столбцов, ключ словаря будет добавлен к указанному в спецификации квалификатору столбца, и значение словаря будет значением Accumulo. Если "columns" не указан или представляет собой пустую строку, он обрабатывается как "*". Это означает, что при отсутствии строки спецификации столбцов при чтении все столбцы в заданной строке Accumulo будут помещены в один словарь (при этом ключи словаря будут разделены двоеточием для сохранения семейства/квалификатора столбцов из Accumulo). При записи ключи словаря будут помещены в семейство столбцов, а квалификатор столбца будет пустым. |
| 'options' | Строка, содержащая параметры, разделенные пробелами ("optionA значениеA -optionB значениеB -optionC значениеC") В настоящее время поддерживаются следующие параметры:
|
Использование
AccumuloStorage имеет функциональность для хранения или извлечения данных из Accumulo. Его целью является предоставление простой и широко применимой схемы таблиц, совместимой с API Pig. Каждый кортеж содержит подмножество столбцов, хранящихся в одной строке таблицы Accumulo, что зависит от столбцов, переданных в качестве аргумента функции. Если указан '*', будут возвращены все столбцы таблицы. Второй аргумент предоставляет управление различными параметрами, которые могут использоваться для изменения различных свойств.
При вызове скриптов Pig, использующих AccumuloStorage, важно убедиться, что в классе пути Pig присутствуют jar-файлы Accumulo. Это легко достигается с помощью переменной среды ACCUMULO_HOME.
PIG_CLASSPATH="$ACCUMULO_HOME/lib/*:$PIG_CLASSPATH" pig my_script.pig
Пример загрузки
Просто получить все столбцы из кодов аэропортов, которые находятся между Бостоном и Сан-Франциско, которые можно просмотреть с авторизациями Accumulo «auth1» и/или «auth2».
raw = LOAD 'accumulo://airports?instance=accumulo&user=root&password=passwd&zookeepers=localhost'
USING org.apache.pig.backend.hadoop.accumulo.AccumuloStorage(
'*', '-a auth1,auth2 -s BOS -e SFO') AS
(code:chararray, all_columns:map[]);
Типы данных столбцов объявляются с помощью фразы «AS». В этом примере уникальный код аэропорта, который является ключом строки, назначается переменной «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 значениеA -optionB значениеB -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 | Необязательный int, указывающий метод округления, в соответствии с константами, предоставляемыми Java. |
Использование
Используйте функцию ROUND для возврата значения выражения, округленного до фиксированного количества знаков. Для float результатом будет float; для double результатом будет double.
Результат кратен digits-ой степени десяти: 0 приводит к отсутствию дробных знаков; отрицательное значение обнуляет соответствующее количество мест слева от десятичной точки.
Когда mode опущен или имеет значение 6 (RoundingMode.HALF_EVEN), результат округляется до ближайшего соседа, а при равенстве расстояний до ближайших чисел, округляется к ближайшему четному числу. Этот режим минимизирует накопленную ошибку и, как правило, сохраняет среднее значение набора значений.
Когда mode имеет значение 4 (RoundingMode.HALF_UP), результат округляется до ближайшего соседа, а при равенстве расстояний до ближайших чисел, округляется от нуля. Этот режим соответствует поведению большинства СУБД SQL.
Для других режимов округления обратитесь к документации Java. Нет режима округления, который соответствует поведению Math.round (т.е. округление к положительной бесконечности) — вините Java, а не Pig.
| val | digits | mode | ROUND_TO(val, digits) |
|---|---|---|---|
| 1234.1789 | 8 | 1234.1789 | |
| 1234.1789 | 4 | 1234.1789 | |
| 1234.1789 | 1 | 1234.2 | |
| 1234.1789 | 0 | 1234.0 | |
| 1234.1789 | -1 | 1230.0 | |
| 1234.1789 | -3 | 1000.0 | |
| 1234.1789 | -4 | 0.0 | |
| 3.25000001 | 1 | 3.3 | |
| 3.25 | 1 | 3.2 | |
| -3.25 | 1 | -3.2 | |
| 3.15 | 1 | 3.2 | |
| -3.15 | 1 | -3.2 | |
| 3.25 | 1 | 4 | 3.3 |
| -3.25 | 1 | 4 | -3.3 |
| 3.5 | 0 | 4.0 | |
| -3.5 | 0 | -4.0 | |
| 2.5 | 0 | 2.0 | |
| -2.5 | 0 | -2.0 | |
| 3.5 | 0 | 4 | 4.0 |
| -3.5 | 0 | 4 | -4.0 |
| 2.5 | 0 | 4 | 3.0 |
| -2.5 | 0 | 4 | -3.0 |
SIN
Возвращает синус выражения.
Синтаксис
| SIN(expression) |
Термины
| expression | Выражение, результатом которого является double. |
Использование
Используйте функцию SIN для возврата синуса выражения.
SINH
Возвращает гиперболический синус выражения.
Синтаксис
| SINH(expression) |
Термины
| expression | Выражение, результатом которого является double. |
Использование
Используйте функцию SINH для возврата гиперболического синуса выражения.
SQRT
Возвращает положительный квадратный корень выражения.
Синтаксис
| SQRT(expression) |
Термины
| expression | Выражение, результатом которого является double. |
Использование
Используйте функцию SQRT для возврата положительного квадратного корня выражения.
TAN
Возвращает тригонометрический тангенс угла.
Синтаксис
| TAN(expression) |
Термины
| expression | Выражение (угол), результатом которого является double. |
Использование
Используйте функцию TAN для возврата тригонометрического тангенса угла.
TANH
Возвращает гиперболический тангенс выражения.
Синтаксис
| TANH(expression) |
Термины
| expression | Выражение, результатом которого является double. |
Использование
Используйте функцию TANH для возврата гиперболического тангенса выражения.
Строковые функции
Для общей информации об этих функциях, см. Спецификацию API Java, Класс String. Обратите внимание на следующее:
-
Имена функций Pig чувствительны к регистру и записываются в ВЕРХНЕМ РЕГИСТРЕ.
-
Функции строк Pig имеют дополнительный первый параметр: строку, к которой применяются все операции.
-
Pig может обрабатывать результаты иначе, чем указано в Спецификации API Java. Если любой из входных параметров имеет значение null или если предоставлено недостаточное количество параметров, возвращается NULL.
ENDSWITH
Проверяет входные данные, чтобы определить, заканчивается ли первый аргумент строкой во втором.
Синтаксис
| ENDSWITH(строка, сравнение) |
Термины
| строка | Строка, которая должна быть проверена. |
| сравнение | Строка для сравнения. |
Использование
Используйте функцию ENDSWITH, чтобы определить, заканчивается ли первый аргумент строкой во втором.
Например, ENDSWITH ('foobar', 'foo') вернёт false, а ENDSWITH ('foobar', 'bar') вернёт true.
EqualsIgnoreCase
Сравнивает две строки, игнорируя регистр.
Синтаксис
| EqualsIgnoreCase(строка1, строка2) |
Термины
| строка1 | Исходная строка. |
| строка2 | Строка для сравнения. |
Использование
Используйте функцию EqualsIgnoreCase, чтобы определить, равны ли две строки, игнорируя регистр.
INDEXOF
Возвращает индекс первого вхождения символа в строке, выполняя поиск вперёд с начального индекса.
Синтаксис
| INDEXOF(строка, 'символ', начальныйИндекс) |
Термины
| строка | Строка для поиска. |
| 'символ' | Искомый символ, в кавычках. |
| начальныйИндекс | Индекс, с которого начинается поиск вперёд. Индекс строки начинается с нуля (0). |
Использование
Используйте функцию INDEXOF, чтобы определить индекс первого вхождения символа в строке. Поиск вперёд символа начинается с указанного начального индекса.
LAST_INDEX_OF
Возвращает индекс последнего вхождения символа в строке, выполняя поиск назад от конца строки.
Синтаксис
| LAST_INDEX_OF(строка, 'символ') |
Термины
| строка | Строка для поиска. |
| 'символ' | Искомый символ, в кавычках. |
Использование
Используйте функцию LAST_INDEX_OF, чтобы определить индекс последнего вхождения символа в строке. Поиск назад символа начинается с конца строки.
LCFIRST
Преобразует первый символ в строке в нижний регистр.
Синтаксис
| LCFIRST(выражение) |
Термины
| выражение | Выражение, результат которого имеет тип chararray. |
Использование
Используйте функцию LCFIRST, чтобы преобразовать только первый символ в строке в нижний регистр.
LOWER
Преобразует все символы в строке в нижний регистр.
Синтаксис
| LOWER(выражение) |
Термины
| выражение | Выражение, результат которого имеет тип chararray. |
Использование
Используйте функцию LOWER, чтобы преобразовать все символы в строке в нижний регистр.
LTRIM
Возвращает копию строки, из которой удалены только начальные пробелы.
Синтаксис
| LTRIM(выражение) |
Термины
| выражение | Выражение, результатом которого является chararray. |
Использование
Используйте функцию LTRIM для удаления начальных пробелов из строки.
REGEX_EXTRACT
Выполняет сопоставление с регулярным выражением и извлекает сопоставленную группу, определённую индексом параметра.
Синтаксис
| REGEX_EXTRACT (строка, регулярноеВыражение, индекс) |
Термины
| строка | Строка, в которой выполняется сопоставление. |
| регулярноеВыражение | Регулярное выражение. |
| индекс | Индекс сопоставленной группы для возврата. |
Использование
Используйте функцию REGEX_EXTRACT для выполнения сопоставления с регулярным выражением и извлечения сопоставленной группы, определённой параметром индекса (где индекс является параметром с основанием 1). Функция использует форму регулярных выражений Java.
Функция возвращает строку, соответствующую сопоставленной группе в указанной позиции индекса. Если в этой позиции нет сопоставленного выражения, возвращается NULL.
Пример
Этот пример вернёт строку '192.168.1.5'.
REGEX_EXTRACT('192.168.1.5:8020', '(.*):(.*)', 1);
REGEX_EXTRACT_ALL
Выполняет сопоставление с регулярным выражением и извлекает все сопоставленные группы.
Синтаксис
| REGEX_EXTRACT_ALL (строка, регулярноеВыражение) |
Термины
| строка | Строка, в которой выполняется сопоставление. |
| регулярноеВыражение | Регулярное выражение. |
Использование
Используйте функцию REGEX_EXTRACT_ALL для выполнения сопоставления с регулярным выражением и извлечения всех сопоставленных групп. Функция использует форму регулярных выражений Java.
Функция возвращает кортеж, где каждый элемент представляет собой сопоставленное выражение. Если совпадений нет, возвращается пустой кортеж.
Пример
Этот пример вернёт кортеж (192.168.1.5,8020).
REGEX_EXTRACT_ALL('192.168.1.5:8020', '(.*)\:(.*)');
REPLACE
Заменяет существующие символы в строке на новые.
Синтаксис
| REPLACE(строка, 'регулярноеВыражение', 'новыйСимвол'); |
Термины
| строка | Строка, подлежащая обновлению. |
| 'регулярноеВыражение' | Регулярное выражение, с которым должна соответствовать строка, в кавычках. |
| 'новыйСимвол' | Новые символы, заменяющие существующие, в кавычках. |
Использование
Используйте функцию REPLACE для замены существующих символов в строке на новые символы.
Например, для изменения "open source software" на "open source wiki" используйте это выражение: REPLACE(строка,'software','wiki')
Обратите внимание, что функция REPLACE внутренне реализуется с помощью java.string.replaceAll(String regex, String replacement), где 'регулярноеВыражение' и 'новыйСимвол' передаются в качестве 1-го и 2-го аргумента соответственно. Если необходимо заменить специальные символы такие как '[' в строковом литерале, необходимо экранировать их в 'регулярноеВыражение' с помощью двойных обратных слэшей (например, '\\[').
RTRIM
Возвращает копию строки, из которой удалены только конечные пробелы.
Синтаксис
| RTRIM(выражение) |
Термины
| выражение | Выражение, результатом которого является chararray. |
Использование
Используйте функцию RTRIM для удаления конечных пробелов из строки.
SPRINTF
Форматирует набор значений в соответствии с шаблоном в стиле printf, используя библиотеку native Java Formatter.
Синтаксис
| SPRINTF(формат, [...значения]) |
Термины
| формат | Строка в стиле printf, описывающая шаблон. |
| значения | Значения для размещения в шаблоне. Должен быть элемент кортежа для каждого местазаполнителя форматирования, и он должен иметь правильный тип: int или long для целочисленных форматов, таких как %d; float или double для десятичных форматов, таких как %f; и long для форматов дат/времени, таких как %t. |
Использование
Используйте функцию SPRINTF для форматирования строки в соответствии с шаблоном. Например, SPRINTF("part-%05d", 69) вернёт 'part-00069'.
| Спецификация формата строки | arg1 | arg2 | arg3 | SPRINTF(формат, arg1, arg2) | примечания |
|---|---|---|---|---|---|
| '%8s|%8d|%-8s' | 1234567 | 1234567 | 'yay' | ' 1234567| 1234567|yay ' | Строки форматируются с использованием %s, целые числа с %d. Типы преобразуются при необходимости (здесь int -> строка). |
| (нулевое значение) | 1234567 | 1234567 | 'yay' | (нулевое значение) | Возвращает null (без ошибок или предупреждений) при нулевом значении строки формата. |
| '%8s|%8d|%-8s' | 1234567 | (нулевое значение) | 'yay' | (нулевое значение) | Возвращает null (без ошибок или предупреждений), если какой-либо из аргументов равен null. |
| '%8.3f|%6x' | 123.14159 | 665568 | ' 123.142| a27e0' | Форматирование чисел с плавающей точкой/двойной точностью с помощью %f, шестнадцатеричных целых чисел с помощью %x (есть и другие -- см. документацию Java) | |
| '%,+10d|%(06d' | 1234567 | -123 | '+1,234,567|(0123)' | Числа принимают префиксный модификатор: , для локализованной группировки тысяч, 0 для дополнения нулями; + для всегда показа знака плюс для положительных чисел; пробел для добавления пробела перед положительными числами; ( для указания отрицательных чисел в скобках (в стиле бухгалтера). | |
| '%2$5d: %3$6s %1$3s %2$4x (%<4X)' | 'the' | 48879 | 'wheres' | '48879: wheres the beef (BEEF)' | Ссылка на аргументы по их положению и любое количество раз с помощью %(pos)$.... Использование %<... для ссылки на ранее указанный аргумент. |
| 'Launch Time: %14d %s' | ToMilliSeconds(CurrentTime()) | ToString(CurrentTime(), 'yyyy-MM-dd HH:mm:ss Z') | 'Launch Time: 1400164132000 2014-05-15 09:28:52 -0500' | Вместо этого используйте ToString для форматирования частей даты/времени и SPRINTF для вывода результатов. | |
| '%8s|%-8s' | 1234567 | MissingFormatArgumentException: Форматный спецификатор '%-8s' |
Вы должны предоставить аргументы для всех спецификаторов | ||
| '%8s' | 1234567 | 'ignored' | 'also' | 1234567 | В порядке предоставление больше аргументов, чем нужно |
Примечание: хотя форматировщик Java (и, следовательно, эта функция) предлагает спецификатор %t для элементов даты/времени, от него лучше отказаться: он громоздкий, вывод и обработка часового пояса могут отличаться от ожидаемого, и он не принимает объекты datetime из pig. Вместо этого просто подготовьте даты с помощью функции ToString UDF, как показано.
STARTSWITH
Проверяет входные данные, чтобы определить, начинается ли первый аргумент со строки во втором.
Синтаксис
| STARTSWITH(строка, сравнение) |
Термины
| строка | Строка, подлежащая проверке. |
| сравнение | Строка для сравнения. |
Использование
Используйте функцию STARTSWITH, чтобы определить, начинается ли первый аргумент со строки во втором.
Например, STARTSWITH ('foobar', 'foo') вернёт true, а STARTSWITH ('foobar', 'bar') вернёт false.
STRSPLIT
Разделяет строку по совпадениям с заданным регулярным выражением.
Синтаксис
| STRSPLIT(строка, регулярное_выражение, ограничение) |
Термины
| строка | Строка, подлежащая разделению. |
| регулярное_выражение | Регулярное выражение. |
| ограничение | Если значение положительное, шаблон (скомпилированное представление регулярного выражения) применяется не более limit-1 раз, следовательно, значение аргумента означает максимальную длину результата кортежа. Последний элемент результата кортежа будет содержать все входные данные после последнего совпадения. Если значение отрицательное, ограничение для длины результата кортежа не применяется. Если значение равно нулю, ограничение для длины результата кортежа тоже не применяется, и последующие пустые строки (если есть) будут удалены. |
Использование
Используйте функцию STRSPLIT для разделения строки по совпадениям с заданным регулярным выражением.
Например, для строки (open:source:software), STRSPLIT (строка, ':',2) вернёт ((open,source:software)), а STRSPLIT (строка, ':',3) вернёт ((open,source,software)).
STRSPLITTOBAG
Разделяет строку по совпадениям с заданным регулярным выражением и возвращает пакет данных.
Синтаксис
| STRSPLITTOBAG(строка, регулярное_выражение, ограничение) |
Термины
| строка | Строка, подлежащая разделению. |
| регулярное_выражение | Регулярное выражение. |
| ограничение | Если значение положительное, шаблон (скомпилированное представление регулярного выражения) применяется не более limit-1 раз, следовательно, значение аргумента означает максимальный размер результата пакета. Последний кортеж результата пакета будет содержать все входные данные после последнего совпадения. Если значение отрицательное, ограничение для размера результата пакета не применяется. Если значение равно нулю, ограничение для размера результата пакета тоже не применяется, и последующие пустые строки (если есть) будут удалены. |
Использование
Используйте функцию STRSPLITTOBAG для разделения строки по совпадениям с заданным регулярным выражением.
Например, для строки (open:source:software), STRSPLITTOBAG (строка, ':',2) вернёт {(open),(source:software)}, а STRSPLITTOBAG (строка, ':',3) вернёт {(open),(source),(software)}.
SUBSTRING
Возвращает подстроку из заданной строки.
Синтаксис
| SUBSTRING(строка, начальный_индекс, конечный_индекс) |
Термины
| строка | Строка, из которой будет извлечена подстрока. |
| начальный_индекс | Индекс (тип целое число) первой буквы подстроки. Индекс строки начинается с нуля (0). |
| конечный_индекс | Индекс (тип целое число) символа, следующего за последней буквой подстроки. |
Использование
Используйте функцию SUBSTRING для возврата подстроки из заданной строки.
Для поля с именем alpha, значение которого ABCDEF, для возврата подстроки BCD используйте эту команду: SUBSTRING(alpha,1,4). Обратите внимание, что 1 - индекс B (первый символ подстроки), а 4 - индекс E (символ, следующий за последним символом подстроки).
TRIM
Возвращает копию строки с удалёнными начальными и конечными пробелами.
Синтаксис
| TRIM(выражение) |
Термины
| выражение | Выражение, результатом которого является chararray. |
Использование
Используйте функцию TRIM, чтобы удалить начальные и конечные пробелы из строки.
UCFIRST
Возвращает строку с первым символом, преобразованным в верхний регистр.
Синтаксис
| UCFIRST(выражение) |
Термины
| выражение | Выражение, результат которого имеет тип chararray. |
Использование
Используйте функцию UCFIRST, чтобы преобразовать только первый символ строки в верхний регистр.
UPPER
Возвращает строку, преобразованную в верхний регистр.
Синтаксис
| UPPER(выражение) |
Термины
| выражение | Выражение, результат которого имеет тип chararray. |
Использование
Используйте функцию UPPER для преобразования всех символов строки в верхний регистр.
UniqueID
Возвращает уникальный идентификатор строки для каждой записи в псевдониме.
Использование
UniqueID генерирует уникальный идентификатор для каждой записи. Идентификатор имеет вид "taskindex-последовательность"
Функции работы со временем и датой
Для общей информации об операциях с типом datetime, см. Спецификацию API Java, класс Java Date и класс JODA DateTime. А для информации об форматах дат и времени ISO, обратитесь к Форматы дат и времени.
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(миллисекунды) ToDate(iosстрока) ToDate(пользовательскаястрока, формат) ToDate(пользовательскаястрока, формат, часовойпояс) |
Термины
| миллисекунды | Смещение от 1970-01-01T00:00:00.000Z в миллисекундах (может быть положительным или отрицательным). |
| isoстрока | Строка даты и времени в формате ISO 8601. |
| пользовательскаястрока | Строка даты и времени в пользовательском формате. |
| формат | Шаблон форматирования даты и времени (см. класс Java SimpleDateFormat). |
| часовойпояс | Строка часового пояса. Можно использовать как смещение от UTC, так и формат, основанный на местоположении. Внутренне часовой пояс будет преобразован в формат смещения от UTC. См. документацию Joda-Time для доступных идентификаторов часовых поясов. |
Использование
Используйте функцию ToDate для создания объекта DateTime. Обратите внимание, что если часовой пояс не указан в строке даты и времени ISO или в параметре часового пояса, будет использован по умолчанию.
ToMilliSeconds
Возвращает количество миллисекунд, прошедших с 1 января 1970 года 00:00:00.000 GMT для объекта DateTime.
Синтаксис
| ToMilliSeconds(datetime) |
Термины
| datetime | Объект datetime. |
Использование
Используйте функцию ToMilliSeconds для преобразования DateTime в количество миллисекунд, прошедших с 1 января 1970 года 00:00:00.000 GMT.
ToString
ToString преобразует объект DateTime в строку в формате ISO или в пользовательском формате.
Синтаксис
| ToString(datetime [, строка формата]) |
Термины
| datetime | Объект datetime. |
| строка формата | Шаблон форматирования даты и времени (см. класс Java SimpleDateFormat). |
Использование
Используйте функцию ToString для преобразования DateTime в строку в пользовательском формате.
ToUnixTime
Возвращает Unix Time как значение типа long для объекта DateTime. Unix Time — это количество секунд, прошедших с 1 января 1970 года 00:00:00.000 GMT.
Синтаксис
| ToUnixTime(datetime) |
Термины
| datetime | Объект datetime. |
Использование
Используйте функцию ToUnixTime для преобразования DateTime в Unix Time.
WeeksBetween
Возвращает количество недель между двумя объектами DateTime.
Синтаксис
| WeeksBetween(datetime1, datetime2) |
Термины
| datetime1 | Объект datetime. |
| datetime2 | Другой объект datetime. |
Использование
Используйте функцию WeeksBetween для получения количества недель между двумя заданными объектами datetime.
YearsBetween
Возвращает количество лет между двумя объектами DateTime.
Синтаксис
| YearsBetween(datetime1, datetime2) |
Термины
| datetime1 | Объект datetime. |
| datetime2 | Другой объект datetime. |
Использование
Используйте функцию YearsBetween для получения количества лет между двумя заданными объектами datetime.
Функции кортежей, множеств, словарей
TOTUPLE
Преобразует одно или несколько выражений в тип кортеж.
Синтаксис
| TOTUPLE(выражение [, выражение ...]) |
Термины
| выражение | Выражение любого типа данных. |
Использование
Используйте функцию 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(выражение [, выражение ...]) |
Термины
| выражение | Выражение любого типа данных. |
Использование
Используйте функцию 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(выражение-ключ, выражение-значение [, выражение-ключ, выражение-значение ...]) |
Термины
| выражение-ключ | Выражение типа chararray. |
| выражение-значение | Выражение любого типа, поддерживаемого словарем. |
Использование
Используйте функцию 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,столбец,отношение) |
Термины
| topN | Количество возвращаемых кортежей-лидеров (тип целое число). |
| столбец | Столбец кортежа, значения которого сравниваются. 0 обозначает первый столбец. |
| отношение | Отношение (множество кортежей), содержащее столбец кортежа. |
Использование
Функция TOP возвращает множество, содержащее N лучших кортежей из входного множества, где N контролируется первым параметром функции. Сравнение кортежей выполняется на основе единственного столбца кортежа. Позиция столбца определяется вторым параметром функции. Функция предполагает, что все кортежи в множестве содержат элементы одного типа в сравниваемом столбце.
По умолчанию функция TOP использует убывающий порядок. Но его можно настроить с помощью оператора DEFINE.
DEFINE asc TOP('ASC'); -- ascending order
DEFINE desc TOP('DESC'); -- descending order
Пример
В этом примере возвращаются 10 самых частых вхождений.
DEFINE asc TOP('ASC'); -- ascending order
DEFINE desc TOP('DESC'); -- descending order
A = LOAD 'data' as (first: chararray, second: chararray);
B = GROUP A BY (first, second);
C = FOREACH B generate FLATTEN(group), COUNT(A) as count;
D = GROUP C BY first; -- again group by first
topResults = FOREACH D {
result = asc(10, 1, C); -- and retain top 10 (in ascending order) occurrences of 'second' in first
GENERATE FLATTEN(result);
}
bottomResults = FOREACH D {
result = desc(10, 1, C); -- and retain top 10 (in descending order) occurrences of 'second' in first
GENERATE FLATTEN(result);
}
Hive UDF
Pig вызывает все типы Hive UDF, включая UDF, GenericUDF, UDAF, GenericUDAF и GenericUDTF. В зависимости от используемого Hive UDF, необходимо объявить его в Pig с помощью HiveUDF (обрабатывает UDF и GenericUDF), HiveUDAF (обрабатывает UDAF и GenericUDAF), HiveUDTF (обрабатывает GenericUDTF).
Синтаксис
HiveUDF, HiveUDAF, HiveUDTF используют одинаковый синтаксис.
| HiveUDF(name[, constant parameters]) |
Термины
| name | Имя Hive UDF. Это может быть полное имя класса Hive UDF/UDTF/UDAF, или зарегистрированное короткое имя в Hive FunctionRegistry (большинство встроенных Hive UDF используют это). |
| constant parameters | Необязательная кортеж, представляющая константные параметры Hive UDF/UDTF/UDAF. Если Hive UDF требует константного параметра, нет другого способа, которым Pig может передать эту информацию в Hive, так как схема Pig не содержит информации о том, является ли параметр константой. Нулевой элемент в кортеже означает, что этот элемент не является константой. Не нулевой элемент представляет константное поле. Тип данных для элемента определяется анализатором констант Pig. |
Пример
HiveUDF
define sin HiveUDF('sin');
A = LOAD 'student' as (name:chararray, age:int, gpa:double);
B = foreach A generate sin(gpa);
HiveUDTF
define explode HiveUDTF('explode');
A = load 'mydata' as (a0:{(b0:chararray)});
B = foreach A generate flatten(explode(a0));
HiveUDAF
define avg HiveUDAF('avg');
A = LOAD 'student' as (name:chararray, age:int, gpa:double);
B = group A by name;
C = foreach B generate group, avg(A.age);
HiveUDAF с константным параметром
define in_file HiveUDF('in_file', '(null, "names.txt")');
A = load 'student' as (name:chararray, age:long, gpa:double);
B = foreach A generate in_file(name, 'names.txt');
В этом примере мы передаем (null, "names.txt") в конструктор UDF in_file, что означает, что первый параметр является обычным, а второй – константным. names.txt может быть заключен в двойные кавычки (в отличие от другого синтаксиса Pig), или в одинарные. Обратите внимание, что нам нужно снова передать 'names.txt' в строке 3. Это выглядит глупо, но нам нужно это сделать, чтобы заполнить семантический разрыв между Pig и Hive. Нам нужно передать константу в конвейер данных в строке 3, что аналогично Pig UDF. Код инициализации в Hive UDF принимает ObjectInspector, который фиксирует тип данных и является ли параметр константой. Однако код инициализации в Pig принимает схему, которая фиксирует только первое. Нам нужно использовать дополнительный механизм (параметр конструктора), чтобы передать последнее.
Примечание: несколько Hive 0.14 UDF содержат ошибку, которая влияет на Pig и исправлена в Hive 1.0. Вот список: compute_stats, context_ngrams, count, ewah_bitmap, histogram_numeric, collect_list, collect_set, ngrams, case, in, named_struct, stack, percentile_approx.
© 2007–2016 Apache Software Foundation
Licensed under the Apache Software License version 2.0.
https://pig.apache.org/docs/r0.15.0/func.html