Встроенные функции
Введение
Pig предоставляет набор встроенных функций (функции eval, загрузки/хранения, математические, строковые, мешков и кортежей). Две основные характеристики отличают встроенные функции от пользовательских функций (UDFs). Во-первых, встроенные функции не требуют регистрации, потому что Pig знает, где они находятся. Во-вторых, встроенные функции не требуют квалификации при использовании, потому что Pig знает, где их найти.
Динамические вызыватели
Часто требуется использовать простую функцию, уже предоставляемую стандартными Java-библиотеками, но для которой не была написана пользовательская функция (UDF). Динамические вызыватели позволяют ссылаться на Java-функции без необходимости обертывания их в пользовательские UDF, за счет выполнения Java-рефлексии при каждом вызове функции.
...
DEFINE UrlDecode InvokeForString('java.net.URLDecoder.decode', 'String String');
encoded_strings = LOAD 'encoded_strings.txt' as (encoded:chararray);
decoded_strings = FOREACH encoded_strings GENERATE UrlDecode(encoded, 'UTF-8');
...
В настоящее время динамические вызыватели могут использоваться для любых статических функций, которые:
- Не принимают аргументы или принимают комбинацию строк, целых чисел, длинных целых чисел, двойных или плавающих чисел или массивов с этими же типами
- Возвращают строку, целое число, длинное целое число, двойное или плавающее число
Только примитивные типы могут использоваться для чисел; числовые классы с заглавными буквами не могут использоваться в качестве аргументов. В зависимости от типа возвращаемого значения необходимо использовать определенный тип вызывателя: InvokeForString, InvokeForInt, InvokeForLong, InvokeForDouble или InvokeForFloat.
Оператор DEFINE используется для привязки ключевого слова к Java-методу, как указано выше. Первый аргумент конструктора InvokeFor* — это полный путь к нужному методу. Второй аргумент — это разделенный пробелами упорядоченный список типов аргументов метода. Он может быть опущен или быть пустой строкой, если метод не принимает аргументов. Допустимые имена классов — string, long, float, double и int. Вызыватели также могут работать с массивами аргументов, представленными в Pig как DataBags элементов однократного кортежа. Например, просто укажите string[]. Имена классов не чувствительны к регистру.
Возможность использования вызывателей для методов, принимающих массивы аргументов, делает доступными методы из org.apache.commons.math.stat.StatUtils (например, для обработки результатов группировки наборов данных). Это полезно, но стоит предостеречь: получившийся UDF не будет оптимизирован для Hadoop, и значительные преимущества от реализации интерфейсов Algebraic и Accumulator будут утрачены. Будьте осторожны, если используете вызыватели таким образом.
Функции Eval
СРЗНАЧ
Вычисляет среднее арифметическое числовых значений в одностолбцовой сумме.
Синтаксис
| СРЗНАЧ(выражение) |
Термины
| выражение | Любое выражение, результат которого — сумма. Элементы суммы должны иметь тип данных int, long, float, double, bigdecimal, biginteger или bytearray. |
Применение
Используйте функцию СРЗНАЧ для вычисления среднего арифметического числовых значений в одностолбцовой сумме. СРЗНАЧ требует предшествующего оператора GROUP ALL для глобальных средних значений и оператора GROUP BY для средних значений групп.
Функция СРЗНАЧ игнорирует значения NULL.
Пример
В этом примере вычисляется средняя оценка 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 создаёт одну строку из элементов суммы, аналогично функции SQL GROUP_CONCAT. Следует иметь в виду следующее:
- Суммы могут иметь произвольный размер, в то время как строки в Java не могут: вы либо исчерпаете доступную память, либо превысите максимальное количество символов (около 2 миллиардов). Одна из худших особенностей производственной задачи — пороговое поведение: всё будет казаться почти в порядке, пока размер данных вашей самой большой суммы не вырастет от почти-слишком-большого до просто-чуть-слишком-большого.
- Суммы не упорядочены, если вы явно не примените вложенную операцию ORDER BY, как показано ниже. Вложенный FOREACH сохранит порядок, позволяя вам упорядочивать по одному набору полей, а затем проектировать только те значения, которые вам нужны для конкатенации.
- Применяется преобразование в строку по умолчанию для каждого элемента. Если элементы суммы не являются атомами (кортежи, карты и т.д.), это может не быть тем, что вы хотите. Используйте вложенный FOREACH для форматирования значений, а затем объедините их с BagToString, как показано ниже.
Примеры:
| vals | delimiter | BagToString(vals, delimiter) | Примечания |
|---|---|---|---|
| {('BOS'),('NYA'),('BAL')} | BOS_NYA_BAL | Если указан только один аргумент, поле разделяются символами нижнего подчеркивания | |
| {('BOS'),('NYA'),('BAL')} | '|' | BOS|NYA|BAL | Но вы можете указать свой собственный разделитель |
| {('BOS'),('NYA'),('BAL')} | '' | BOSNYABAL | Используйте явную пустую строку, чтобы просто склеить всё вместе |
| {(1),(2),(3)} | '|' | 1|2|3 | Элементы преобразуются для вас в тип (но см. примеры ниже) |
Примеры
Простые строковые значения с разделителями простые:
team_parks = LOAD 'team_parks' AS (team_id:chararray, park_id:chararray, years:bag{(year_id:int)});
-- BOS BOS07 {(1995),(1997),(1996),(1998),(1999)}
-- NYA NYC16 {(1995),(1999),(1998),(1997),(1996)}
-- NYA NYC17 {(1998)}
-- SDN HON01 {(1997)}
-- SDN MNT01 {(1996),(1999)}
-- SDN SAN01 {(1999),(1997),(1998),(1995),(1996)}
team_parkslist = FOREACH (GROUP team_parks BY team_id) GENERATE
group AS team_id, BagToString(team_parks.park_id, ';');
-- BOS BOS07
-- NYA NYC17;NYC16
-- SDN SAN01;MNT01;HON01
Обработка сложных элементов по умолчанию работает, но, вероятно, не то, что вам нужно.
team_parkyearsugly = FOREACH (GROUP team_parks BY team_id) GENERATE
group AS team_id,
BagToString(team_parks.(park_id, years));
-- BOS BOS07_{(1995),(1997),(1996),(1998),(1999)}
-- NYA NYC17_{(1998)}_NYC16_{(1995),(1999),(1998),(1997),(1996)}
-- SDN SAN01_{(1999),(1997),(1998),(1995),(1996)}_MNT01_{(1996),(1999)}_HON01_{(1997)}
Вместо этого соберите всё по частям. На шаге 2 мы сортируем по одному полю, но обрабатываем другое; он остаётся в отсортированном порядке.
team_park_yearslist = FOREACH team_parks {
years_o = ORDER years BY year_id;
GENERATE team_id, park_id, SIZE(years_o) AS n_years, BagToString(years_o, '/') AS yearslist;
};
team_parkyearslist = FOREACH (GROUP team_park_yearslist BY team_id) {
tpy_o = ORDER team_park_yearslist BY n_years DESC, park_id ASC;
tpy_f = FOREACH tpy_o GENERATE CONCAT(park_id, ':', yearslist);
GENERATE group AS team_id, BagToString(tpy_f, ';');
};
-- BOS BOS07:1995/1996/1997/1998/1999
-- NYA NYC16:1995/1996/1997/1998/1999;NYC17:1998
-- SDN SAN01:1995/1996/1997/1998/1999;MNT01:1996/1999;HON01:1997
СОЕДИНЕНИЕ
Объединяет два или более выражений одинакового типа.
Синтаксис
| 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)
СЧЕТ
Вычисляет количество элементов в сумме.
Синтаксис
| СЧЕТ(выражение) |
Термины
| выражение | Выражение с типом данных сумма. |
Применение
Используйте функцию СЧЕТ для вычисления количества элементов в сумме. СЧЕТ требует предшествующего оператора GROUP ALL для глобальных подсчётов и оператора GROUP BY для подсчётов групп.
Функция СЧЕТ следует синтаксическим правилам и игнорирует значения null. Это означает, что кортеж в сумме не будет учтён, если ПЕРВОЕ ПОЛЕ этого кортежа равно NULL. Если вы хотите включить значения NULL в вычисление подсчёта, используйте СЧЕТ_ЗВЁЗД.
Примечание: Вы не можете использовать обозначение кортежа (*) с СЧЕТОМ; то есть СЧЕТ(*) не будет работать.
Пример
В этом примере подсчитываются кортежи в сумме (см. оператор 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 | |
| СЧЕТ | long | long | long | long | long | long |
СЧЕТ_ЗВЁЗД
Вычисляет количество элементов в сумме.
Синтаксис
| СЧЕТ_ЗВЁЗД(выражение) |
Термины
| выражение | Выражение с типом данных сумма. |
Применение
Используйте функцию СЧЕТ_ЗВЁЗД для вычисления количества элементов в сумме. СЧЕТ_ЗВЁЗД требует предшествующего оператора GROUP ALL для глобальных подсчётов и оператора GROUP BY для подсчётов групп.
СЧЕТ_ЗВЁЗД включает значения NULL в вычисление подсчёта (в отличие от СЧЕТ, который игнорирует значения NULL).
Пример
В этом примере используется СЧЕТ_ЗВЁЗД для подсчёта кортежей в сумме.
X = FOREACH B GENERATE COUNT_STAR(A);
РАЗН
Сравнивает два поля в кортеже.
Синтаксис
| РАЗН (выражение, выражение) |
Термины
| выражение | Выражение с любым типом данных. |
Применение
Функция РАЗН принимает две суммы в качестве аргументов и сравнивает их. Любые кортежи, которые присутствуют в одной сумме, но отсутствуют в другой, возвращаются в сумме. Если суммы совпадают, возвращается пустая сумма. Если поля не являются суммами, они будут обернуты в кортежи и возвращены в сумме, если они не совпадают, или возвращается пустая сумма, если два записи совпадают. Реализация предполагает, что обе суммы, передаваемые функции РАЗН, полностью помещаются в память одновременно. Если это не так, UDF всё равно будет работать, но это будет ОЧЕНЬ медленно.
Пример
В этом примере РАЗН сравнивает кортежи в двух суммах.
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)})
Пустая
Проверяет, является ли сумма или карта пустой.
Синтаксис
| Пустая(выражение) |
Термины
| выражение | Выражение с любым типом данных. |
Применение
Функция Пустая проверяет, является ли сумма или карта пустой (не содержит данных). Функция может использоваться для фильтрации данных.
Пример
В этом примере находятся все студенты с 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);
МАКС
Вычисляет максимальное значение числовых данных или chararrays в одностолбцовом наборе. MAX требует предшествующего оператора GROUP ALL для глобального максимума и оператора GROUP BY для группового максимума.
Синтаксис
| MAX(выражение) |
Термины
| выражение | Выражение с типами данных int, long, float, double, bigdecimal, biginteger, chararray, datetime или bytearray. |
Использование
Используйте функцию MAX для вычисления максимального значения числовых данных или chararrays в одностолбцовом наборе.
Функция 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
Вычисляет минимальное значение числовых данных или chararrays в одностолбцовом наборе. MIN требует предшествующего оператора GROUP… ALL для глобального минимума и оператора GROUP… BY для группового минимума.
Синтаксис
| MIN(выражение) |
Термины
| выражение | Выражение с типами данных int, long, float, double, bigdecimal, biginteger, chararray, datetime или bytearray. |
Использование
Используйте функцию MIN для вычисления минимального значения набора числовых данных или chararrays в одностолбцовом наборе.
Функция 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
Позволяет пользователю указать строковый префикс и затем отфильтровать столбцы в отношении, начинающиеся с этого префикса.
Синтаксис
| DEFINE pluck PluckTuple(выражение1) pluck(выражение2) |
Термины
| выражение1 | Префикс для извлечения |
| выражение2 | Поля для применения извлечения, обычно «*» |
Использование
Пример:
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}
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 | возвращает количество пар ключ/значение в карте |
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() |
Термины
| нет | нет параметров |
Использование
Pig использует BinStorage для загрузки и сохранения временных данных, которые генерируются между несколькими заданиями MapReduce.
- BinStorage работает с данными, представленными на диске в машиночитаемом формате. BinStorage НЕ поддерживает сжатие.
- BinStorage поддерживает несколько расположений (файлы, каталоги, шаблоны) в качестве входных данных.
Иногда пользователи используют BinStorage для хранения собственных данных. Однако, поскольку BinStorage - это закрытый двоичный формат, исходные данные никогда не хранятся в BinStorage - это всегда производная от других данных.
Мы видели несколько примеров, когда пользователи делали что-то вроде этого:
a = load 'b.txt' as (id, f); b = group a by id; store b into 'g' using BinStorage();
И затем позже:
a = load 'g/part*' using BinStorage() as (id, d:bag{t:(v, s)});
b = foreach a generate (double)id, flatten(d);
dump b;
Существует проблема с этой последовательностью событий. Первый скрипт не определяет типы данных и, в результате, данные хранятся как массив байтов и набор с кортежем, содержащим два массива байтов. Второй скрипт пытается преобразовать массив байтов в двойное значение; однако, поскольку данные были получены из другого загрузчика, он не может знать формат массива байтов или как преобразовать его в другой тип. Для решения этой проблемы Pig:
- Выводит сообщение об ошибке при выполнении второго скрипта: "Ошибка 1118: Невозможно преобразовать байты, загруженные из BinStorage. Пожалуйста, предоставьте пользовательский преобразователь."
- Позволяет использовать пользовательский преобразователь для выполнения преобразования.
a = load 'g/part*' using BinStorage('Utf8StorageConverter') as (id, d:bag{t:(v, s)}); b = foreach a generate (double)id, flatten(d); dump b;
Примеры
В этом примере BinStorage используется с функциями LOAD и STORE.
A = LOAD 'data' USING BinStorage(); STORE X into 'output' USING BinStorage();
В этом примере BinStorage используется для загрузки нескольких расположений.
A = LOAD 'input1.bin, input2.bin' USING BinStorage();
BinStorage не отслеживает происхождение данных. Когда Pig использует BinStorage для перемещения данных между заданиями MapReduce, Pig может определить правильную функцию преобразования и применить ее. Однако, как показано в примере ниже, когда вы сохраняете данные с помощью BinStorage, а затем используете отдельный скрипт Pig Latin для чтения данных (тем самым теряя информацию о типе), вы несете ответственность за правильное преобразование данных перед сохранением с помощью BinStorage.
raw = load 'sampledata' using BinStorage() as (col1,col2, col3);
--filter out null columns
A = filter raw by col1#'bcookie' is not null;
B = foreach A generate col1#'bcookie' as reqcolumn;
describe B;
--B: {regcolumn: bytearray}
X = limit B 5;
dump X;
(36co9b55onr8s)
(36co9b55onr8s)
(36hilul5oo1q1)
(36hilul5oo1q1)
(36l4cj15ooa8a)
B = foreach A generate (chararray)col1#'bcookie' as convertedcol;
describe B;
--B: {convertedcol: chararray}
X = limit B 5;
dump X;
()
()
()
()
()
JsonLoader, JsonStorage
Загрузка или сохранение данных JSON.
Синтаксис
| JsonLoader( [‘схема’] ) |
| JsonStorage( ) |
Термины
| схема | Необязательная схема Pig, в одинарных кавычках. |
Использование
Используйте JsonLoader для загрузки данных JSON.
Используйте JsonStorage для сохранения данных JSON.
Обратите внимание, что в JsonLoader и JsonStorage нет понятия разделителя. Данные закодированы в стандартном формате JSON. JsonLoader необязательно принимает схему в качестве аргумента конструкции.
Примеры
В этом примере данные загружаются со схемой.
a = load 'a.json' using JsonLoader('a0:int,a1:{(a10:int,a11:chararray)},a2:(a20:double,a21:bytearray),a3:[chararray]');
В этом примере данные загружаются без схемы; предполагается, что в каталоге ввода существует .pig_schema (произведенный JsonStorage).
a = load 'a.json' using JsonLoader();
PigDump
Сохраняет данные в формате UTF-8.
Синтаксис
| PigDump() |
Термины
| нет | нет параметров |
Использование
PigDump сохраняет данные как кортежи в удобочитаемом формате UTF-8.
Пример
В этом примере PigDump используется с функцией STORE.
STORE X INTO 'output' USING PigDump();
PigStorage
Загружает и сохраняет данные как структурированные текстовые файлы.
Синтаксис
| PigStorage( [разделитель_полей] , ['опции'] ) |
Термины
| разделитель_полей | По умолчанию разделитель полей - табуляция ('\t'). Вы можете указать другие символы в качестве разделителей полей; однако, убедитесь, что вы заключили символы в одинарные кавычки. |
| 'опции' | Строка, содержащая разделенные пробелами опции (‘optionA optionB optionC’) В настоящее время поддерживаются следующие опции:
|
Использование
PigStorage - это функция по умолчанию, используемая Pig для загрузки/сохранения данных. PigStorage поддерживает структурированные текстовые файлы (в удобочитаемом формате UTF-8) в сжатом или несжатом виде (см. Обработка сжатия). Все типы данных Pig (данные), как простые, так и сложные, могут быть считываться/записываться с помощью этой функции. Входные данные для загрузки могут быть файлом, каталогом или шаблоном.
Заявления LOAD/STORE
Заявления LOAD – PigStorage ожидает, что данные будут отформатированы с помощью разделителей полей, либо символа табуляции ('\t'), либо другого указанного символа.
Заявления STORE – PigStorage выводит данные с помощью разделителей полей, либо символа табуляции ('\t'), либо другого указанного символа, а также разделителя записей новой строки ('\n').
Разделители полей/записей
Разделители полей – по умолчанию разделителем полей в операторах LOAD и STORE является символ табуляции ('\t'). Вы можете использовать другие символы в качестве разделителей полей, но такие разделители, как ^A или Ctrl-A, должны быть представлены в Unicode (\u0001) с использованием кодировки UTF-16 (см. Википедию ASCII, Unicode и UTF-16).
Разделители записей – для операторов LOAD Pig интерпретирует символы новой строки ('\n'), возврата каретки ('\r' или CTRL-M) и комбинированные символы CR + LF ('\r\n') в качестве разделителей записей (не используйте эти символы в качестве разделителей полей). Для операторов STORE Pig использует символ новой строки ('\n') в качестве разделителя записей.
Схемы
Если указана опция схемы, при сохранении данных в выходном каталоге создается скрытый файл «.pig_schema». Он используется PigStorage (с или без -схема) при загрузке, чтобы определить имена и типы полей данных без необходимости явного указания схемы пользователем в операторе as, если не указан noschema. При загрузке не пытаются объединить конфликтующие схемы. Используется первая схема, встреченная при сканировании файловой системы.
Кроме того, если указана опция схемы, в выходном каталоге создается файл «.pig_headers». Этот файл просто перечисляет алиасы, разделители. Это предназначено для упрощения экспорта в инструменты, которые могут читать файлы с заголовками (достаточно добавить заголовок к вашим данным).
Если опция схемы НЕ указана, при сохранении данных схема не будет записана.
Если опция noschema НЕ указана и схема найдена, она загружается при загрузке данных.
Обратите внимание, что независимо от того, сохраняете ли вы схему, вам всегда нужно указать правильный разделитель для чтения данных. Если вы сохраняете с разделителем «#», а затем загружаете с разделителем по умолчанию, ваши данные не будут правильно обработаны.
Происхождение записей
Если указана опция tagPath или tagFile, PigStorage добавит псевдостолбец INPUT_FILE_PATH или INPUT_FILE_NAME соответственно в начало записи. Как следует из названия, это путь/имя входного файла, содержащего эту конкретную запись. Обратите внимание, что tagsource устарел.
Сложные типы данных
Форматы сложных типов данных показаны здесь:
- Кортеж: заключен в (), элементы разделены запятыми
- Непустой кортеж: (item1,item2,item3)
- Пустой кортеж допустим: ()
- Набор: заключен в {}, кортежи разделены запятыми
- Непустой набор: {{(tuple1),(tuple2),(tuple3)}}
- Пустой набор допустим: {}
- Словарь: заключен в [], элементы разделены запятыми, ключ и значение разделены «#»
- Непустой словарь: [key1#value1,key2#value2]
- Пустой словарь допустим: []
Если в операторе LOAD указана схема, 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 загружает данные со сложным типом данных, набором словаря и двойным значением.
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() |
Термины
| none | без параметров |
Использование
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']) |
Термины
| schema | Строка JSON, определяющая схему Avro для входных данных. Вы можете указать явную схему при сохранении данных или при загрузке данных. При ручном предоставлении схемы Pig будет использовать предоставленную схему для сериализации и десериализации. Это означает, что вы можете предоставить явную схему при сохранении данных, чтобы упростить вывод (например, удалив nullable unions) или переименовать поля. Это также означает, что вы можете предоставить явную схему при чтении данных, чтобы читать только подмножество полей в каждом записях. См. документацию 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 будет преобразована в объединение записи 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 дополнительную информацию. Но иногда может быть удобно вручную указать схему для AvroStorage. Смотрите примеры ниже для примеров по ручному указанию схемы с 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, а столбцы в этой строке могут быть сгруппированы различными статическими или со звёздочкой способами. Базовая функциональность с подстановкой звёздочкой существует для группировки различных семейств/квалификаторов столбцов в Map для загрузки или сериализации Map в какую-либо группу семейств/квалификаторов столбцов при сохранении.
Синтаксис
| AccumuloStorage(['columns'[, 'options']]) |
Аргументы
| 'columns' | Список столбцов, разделенных запятыми, для чтения данных и записи данных. Каждый из этих столбцов может быть одного из трёх типов:
Литерал: это самое простое задание, строка, разделенная двоеточием, которая отображается на семейство столбцов и квалификатор столбца. Это будет читать/записывать простой скаляр из/в Accumulo. Префикс семейства столбцов: при чтении данных это будет получать данные из Accumulo Key-Value в текущей строке, семейство столбцов которой соответствует заданному префиксу. Это приведет к размещению Map в кортеже. При записи данных также ожидается Map в заданном смещении в кортеже, ключи которого будут добавлены к префиксу семейства столбцов, используется пустой квалификатор столбца, и значение Map будет помещено в значение Accumulo. Валидный префикс семейства столбцов — это литерал звёздочка (*), в этом случае ключ Map будет эквивалентен семейству столбцов Accumulo. Префикс квалификатора столбцов: аналогично префиксу семейства столбцов, но работает с квалификатором столбца. При чтении Accumulo Key-Value в той же строке, которые соответствуют заданному семейству столбцов и префиксу квалификатора столбцов, будут помещены в один Map. При записи данных будет использоваться семейство столбцов из задания столбцов, ключ Map будет добавлен к предоставленному в задании префиксу квалификатора столбца, и значение Map будет значением Accumulo. Если «columns» не предоставлен или является пустой строкой, он обрабатывается эквивалентно «*». Это означает, что при отсутствии строки задания столбцов, для чтения все столбцы в заданной строке Accumulo будут помещены в один Map (с ключами Map, разделенными двоеточием, чтобы сохранить семейство/квалификатор столбцов из Accumulo). Для записи ключи Map будут помещены в семейство столбцов, а квалификатор столбцов будет пустым. |
| '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 ’). Текущие параметры применимы только к операции STORE, а не к LOAD. В настоящее время поддерживаются следующие параметры:
|
Пример
OrcStorage в качестве StoreFunc.
A = LOAD 'student.txt' as (name:chararray, age:int, gpa:double);
store A into 'student.orc' using OrcStorage('-c SNAPPY'); -- store student.txt into data.orc with SNAPPY compression
OrcStorage в качестве LoadFunc.
A = LOAD 'student.orc' USING OrcStorage(); describe A; -- See the schema of student.orc B = filter A by age > 25 and gpa < 3; -- filter condition will be pushed up to loader dump B; -- dump the content of student.orc
Типы данных
Большинство типов данных Orc имеют взаимно однозначное отображение на типы данных Pig. Есть несколько исключений:
На стороне загрузчика:
- Orc STRING/CHAR/VARCHAR все отображаются в Pig varchar
- Orc BYTE/BINARY все отображаются в Pig bytearray
- Orc TIMESTAMP/DATE все отображаются в Pig datetime
- Orc DECIMAL отображается в Pig bigdecimal
На стороне сохранителя:
- Pig chararray отображается в Orc STRING
- Pig datetime отображается в Orc TIMESTAMP
- Pig bigdecimal/biginteger отображаются в Orc DECIMAL
- Pig bytearray отображается в Orc BINARY
Проталкивание предиката
Если после OrcStorage есть оператор фильтрации, Pig протащит условие фильтрации в загрузчик. OrcStorage обрезает файлы/полосы/группы строк, которые полностью не удовлетворяют условию. Для файла/полосы/группы строк, содержащих данные, удовлетворяющие условию фильтрации, OrcStorage загрузит файл/полосу/группу строк, а Pig повторно проверит условие фильтрации, чтобы удалить дополнительные данные, которые не удовлетворяют условию фильтрации.
Проталкивание предиката OrcStorage в настоящее время поддерживает все примитивные типы данных, но ни один из сложных типов данных. Например, условие карты не может быть протащено в OrcStorage:
A = LOAD 'student.orc' USING OrcStorage(); B = filter A by info#'age' > 25; -- map condition cannot push to OrcStorage dump B;
В настоящее время в проталкивании предиката OrcStorage поддерживаются следующие выражения в условии фильтрации: >, >=, <, <=, ==, !=, between, in, and, or, not. Отсутствующие выражения: is null, is not null, matches.
Функции математики
Для получения общей информации об этих функциях см. спецификацию Java API, класс Math. Обратите внимание на следующее:
-
Имена функций Pig чувствительны к регистру и пишутся ЗАГЛАВНЫМИ БУКВАМИ.
-
Pig может обрабатывать результаты иначе, чем указано в спецификации Java API:
-
Если результирующее значение равно null или пусто, Pig возвращает null.
-
Если результирующее значение не является числом (NaN), Pig возвращает null.
-
Если Pig не может обработать выражение, Pig возвращает исключение.
-
ABS
Возвращает абсолютное значение выражения.
Синтаксис
| ABS(expression) |
Термины
| expression | Любое выражение, результатом которого является тип int, long, float или double. |
Использование
Используйте функцию ABS для возврата абсолютного значения выражения. Если результат неотрицателен (x ≥ 0), возвращается результат. Если результат отрицателен (x < 0), возвращается отрицание результата.
ACOS
Возвращает арккосинус выражения.
Синтаксис
| ACOS(expression) |
Термины
| expression | Выражение, результатом которого является тип double. |
Использование
Используйте функцию ACOS для возврата арккосинуса выражения.
ASIN
Возвращает арксинус выражения.
Синтаксис
| ASIN(expression) |
Термины
| expression | Выражение, результатом которого является тип double. |
Использование
Используйте функцию ASIN для возврата арксинуса выражения.
ATAN
Возвращает арктангенс выражения.
Синтаксис
| ATAN(expression) |
Термины
| expression | Выражение, результатом которого является тип double. |
Использование
Используйте функцию ATAN для возврата арктангенса выражения.
CBRT
Возвращает кубический корень выражения.
Синтаксис
| CBRT(expression) |
Термины
| expression | Выражение, результатом которого является тип double. |
Использование
Используйте функцию CBRT для возврата кубического корня выражения.
CEIL
Возвращает значение выражения, округленное вверх до ближайшего целого числа.
Синтаксис
| CEIL(expression) |
Термины
| expression | Выражение, результатом которого является тип double. |
Использование
Используйте функцию CEIL для возврата значения выражения, округленного вверх до ближайшего целого числа. Эта функция никогда не уменьшает результирующее значение.
| x | CEIL(x) |
| 4.6 | 5 |
| 3.5 | 4 |
| 2.4 | 3 |
| 1.0 | 1 |
| -1.0 | -1 |
| -2.4 | -2 |
| -3.5 | -3 |
| -4.6 | -4 |
COS
Возвращает тригонометрический косинус выражения.
Синтаксис
| COS(expression) |
Термины
| expression | Выражение (угол), результатом которого является тип double. |
Использование
Используйте функцию COS для возврата тригонометрического косинуса выражения.
COSH
Возвращает гиперболический косинус выражения.
Синтаксис
| COSH(expression) |
Термины
| expression | Выражение, результатом которого является тип double. |
Использование
Используйте функцию COSH для возврата гиперболического косинуса выражения.
EXP
Возвращает число Эйлера e, возведенное в степень x.
Синтаксис
| EXP(expression) |
Термины
| expression | Выражение, результатом которого является тип double. |
Использование
Используйте функцию EXP для возврата значения числа Эйлера e, возведенного в степень x (где x - результирующее значение выражения).
FLOOR
Возвращает значение выражения, округленное вниз до ближайшего целого числа.
Синтаксис
| FLOOR(expression) |
Термины
| expression | Выражение, результатом которого является тип double. |
Использование
Используйте функцию FLOOR для возврата значения выражения, округленного вниз до ближайшего целого числа. Эта функция никогда не увеличивает результирующее значение.
| x | FLOOR(x) |
| 4.6 | 4 |
| 3.5 | 3 |
| 2.4 | 2 |
| 1.0 | 1 |
| -1.0 | -1 |
| -2.4 | -3 |
| -3.5 | -4 |
| -4.6 | -5 |
LOG
Возвращает натуральный логарифм (по основанию e) выражения.
Синтаксис
| LOG(expression) |
Термины
| expression | Выражение, результатом которого является тип double. |
Использование
Используйте функцию LOG для возврата натурального логарифма (по основанию e) выражения.
LOG10
Возвращает логарифм по основанию 10 выражения.
Синтаксис
| LOG10(expression) |
Термины
| expression | Выражение, результатом которого является тип double. |
Использование
Используйте функцию LOG10 для возврата логарифма по основанию 10 выражения.
RANDOM
Возвращает псевдослучайное число.
Синтаксис
| RANDOM( ) |
Термины
| N/A | Нет терминов. |
Использование
Используйте функцию RANDOM для возврата псевдослучайного числа (тип double), большего или равного 0,0 и меньшего 1,0.
ROUND
Возвращает значение выражения, округленное до целого числа.
Синтаксис
| ROUND(expression) |
Термины
| expression | Выражение, результатом которого является тип float или double. |
Использование
Используйте функцию ROUND для возврата значения выражения, округленного до целого числа (если тип результата float) или округленного до long (если тип результата double).
Значения округляются в сторону положительной бесконечности: round(x) = floor(x + 0.5).
| x | ROUND(x) |
| 4.6 | 5 |
| 3.5 | 4 |
| 2.4 | 2 |
| 1.0 | 1 |
| -1.0 | -1 |
| -2.4 | -2 |
| -3.5 | -3 |
| -4.6 | -5 |
ROUND_TO
Возвращает значение выражения, округленного до фиксированного количества десятичных знаков.
Синтаксис
| ROUND_TO(val, digits [, mode]) |
Термины
| val | Выражение, результатом которого является тип float или double: значение для округления. |
| digits | Выражение, результатом которого является тип int: количество знаков для сохранения. |
| mode | Необязательный int, указывающий метод округления, в соответствии с константами, предоставляемыми Java. |
Использование
Используйте функцию ROUND для возврата значения выражения, округленного до фиксированного количества знаков. Для float результатом будет float; для double результатом будет double.
Результат является кратным digits-ой степени десяти: 0 приводит к отсутствию дробных знаков; отрицательное значение обнуляет соответствующее количество мест слева от десятичной точки.
Когда mode опущен или имеет значение 6 (RoundingMode.HALF_EVEN), результат округляется до ближайшего соседа, а при совпадении округляется до ближайшего четного числа. Этот режим минимизирует кумулятивную ошибку и стремится сохранить среднее значение набора значений.
Когда mode имеет значение 4 (RoundingMode.HALF_UP), результат округляется до ближайшего соседа, а при совпадении округляется от нуля. Этот режим соответствует поведению большинства SQL-систем.
Для других режимов округления обратитесь к документации Java. Нет режима округления, который соответствует поведению Math.round (т. е. округление к положительной бесконечности) — вините Java, а не Pig.
| val | digits | mode | ROUND_TO(val, digits) |
|---|---|---|---|
| 1234.1789 | 8 | 1234.1789 | |
| 1234.1789 | 4 | 1234.1789 | |
| 1234.1789 | 1 | 1234.2 | |
| 1234.1789 | 0 | 1234.0 | |
| 1234.1789 | -1 | 1230.0 | |
| 1234.1789 | -3 | 1000.0 | |
| 1234.1789 | -4 | 0.0 | |
| 3.25000001 | 1 | 3.3 | |
| 3.25 | 1 | 3.2 | |
| -3.25 | 1 | -3.2 | |
| 3.15 | 1 | 3.2 | |
| -3.15 | 1 | -3.2 | |
| 3.25 | 1 | 4 | 3.3 |
| -3.25 | 1 | 4 | -3.3 |
| 3.5 | 0 | 4.0 | |
| -3.5 | 0 | -4.0 | |
| 2.5 | 0 | 2.0 | |
| -2.5 | 0 | -2.0 | |
| 3.5 | 0 | 4 | 4.0 |
| -3.5 | 0 | 4 | -4.0 |
| 2.5 | 0 | 4 | 3.0 |
| -2.5 | 0 | 4 | -3.0 |
SIN
Возвращает синус выражения.
Синтаксис
| SIN(expression) |
Термины
| expression | Выражение, результатом которого является double. |
Использование
Используйте функцию SIN для возврата синуса выражения.
SINH
Возвращает гиперболический синус выражения.
Синтаксис
| SINH(expression) |
Термины
| expression | Выражение, результатом которого является double. |
Использование
Используйте функцию SINH для возврата гиперболического синуса выражения.
SQRT
Возвращает положительный квадратный корень из выражения.
Синтаксис
| SQRT(expression) |
Термины
| expression | Выражение, результатом которого является double. |
Использование
Используйте функцию SQRT для возврата положительного квадратного корня из выражения.
TAN
Возвращает тригонометрический тангенс угла.
Синтаксис
| TAN(expression) |
Термины
| expression | Выражение (угол), результатом которого является double. |
Использование
Используйте функцию TAN для возврата тригонометрического тангенса угла.
TANH
Возвращает гиперболический тангенс выражения.
Синтаксис
| TANH(expression) |
Термины
| expression | Выражение, результатом которого является double. |
Использование
Используйте функцию TANH для возврата гиперболического тангенса выражения.
Строковые функции
Для общей информации об этих функциях, см. Java API Specification, Class String. Обратите внимание на следующее:
-
Имена функций Pig чувствительны к регистру и записываются в верхнем регистре.
-
Функции Pig для строк имеют дополнительный первый параметр: строку, к которой применяются все операции.
-
Pig может обрабатывать результаты по-другому, чем указано в Java API Specification. Если любой из входных параметров равен null или если предоставлено недостаточное количество параметров, возвращается NULL.
ENDSWITH
Проверяет входные данные, чтобы определить, заканчивается ли первый аргумент строкой во втором.
Синтаксис
| ENDSWITH(строка, проверкаНа) |
Термины
| строка | Строка, подлежащая проверке. |
| проверкаНа | Строка для проверки. |
Использование
Используйте функцию ENDSWITH, чтобы определить, заканчивается ли первый аргумент строкой во втором.
Например, ENDSWITH ('foobar', 'foo') вернёт false, а ENDSWITH ('foobar', 'bar') вернёт true.
EqualsIgnoreCase
Сравнивает две строки, игнорируя регистр.
Синтаксис
| EqualsIgnoreCase(строка1, строка2) |
Термины
| строка1 | Исходная строка. |
| строка2 | Строка для сравнения. |
Использование
Используйте функцию EqualsIgnoreCase для определения равенства двух строк, игнорируя регистр.
INDEXOF
Возвращает индекс первого вхождения символа в строке, ища вперёд с начального индекса.
Синтаксис
| INDEXOF(строка, 'символ', начальныйИндекс) |
Термины
| строка | Строка для поиска. |
| 'символ' | Искомый символ, в кавычках. |
| начальныйИндекс | Индекс, с которого начинать поиск вперёд. Индекс строки начинается с нуля (0). |
Использование
Используйте функцию INDEXOF для определения индекса первого вхождения символа в строке. Поиск вперёд по символу начинается с указанного начального индекса.
LAST_INDEX_OF
Возвращает индекс последнего вхождения символа в строке, ища назад с конца строки.
Синтаксис
| LAST_INDEX_OF(строка, 'символ') |
Термины
| строка | Строка для поиска. |
| 'символ' | Искомый символ, в кавычках. |
Использование
Используйте функцию LAST_INDEX_OF для определения индекса последнего вхождения символа в строке. Поиск назад по символу начинается с конца строки.
LCFIRST
Преобразует первый символ в строке в нижний регистр.
Синтаксис
| LCFIRST(выражение) |
Термины
| выражение | Выражение, результат которого имеет тип chararray. |
Использование
Используйте функцию LCFIRST для преобразования только первого символа строки в нижний регистр.
LOWER
Преобразует все символы в строке в нижний регистр.
Синтаксис
| LOWER(выражение) |
Термины
| выражение | Выражение, результат которого имеет тип chararray. |
Использование
Используйте функцию LOWER для преобразования всех символов в строке в нижний регистр.
LTRIM
Возвращает копию строки с удалёнными только начальными пробелами.
Синтаксис
| LTRIM(выражение) |
Термины
| выражение | Выражение, результатом которого является chararray. |
Использование
Используйте функцию LTRIM для удаления начальных пробелов из строки.
REGEX_EXTRACT
Выполняет сопоставление с регулярным выражением и извлекает соответствующую группу, определённую индексом.
Синтаксис
| REGEX_EXTRACT (строка, regex, индекс) |
Термины
| строка | Строка, в которой выполняется сопоставление. |
| regex | Регулярное выражение. |
| индекс | Индекс соответствующей группы для возврата. |
Использование
Используйте функцию REGEX_EXTRACT для выполнения сопоставления с регулярным выражением и извлечения соответствующей группы, определённой параметром индекса (где индекс — параметр, начинающийся с 1). Функция использует форму регулярных выражений Java.
Функция возвращает строку, соответствующую соответствующей группе в указанной позиции индекса. Если соответствующего выражения в этой позиции нет, возвращается NULL.
Пример
В этом примере будет возвращена строка '192.168.1.5'.
REGEX_EXTRACT('192.168.1.5:8020', '(.*):(.*)', 1);
REGEX_EXTRACT_ALL
Выполняет сопоставление с регулярным выражением и извлекает все соответствующие группы.
Синтаксис
| REGEX_EXTRACT_ALL (строка, regex) |
Термины
| строка | Строка, в которой выполняется сопоставление. |
| regex | Регулярное выражение. |
Использование
Используйте функцию REGEX_EXTRACT_ALL для выполнения сопоставления с регулярным выражением и извлечения всех соответствующих групп. Функция использует форму регулярных выражений Java.
Функция возвращает кортеж, где каждый элемент представляет соответствующее выражение. Если соответствия нет, возвращается пустой кортеж.
Пример
В этом примере будет возвращён кортеж (192.168.1.5,8020).
REGEX_EXTRACT_ALL('192.168.1.5:8020', '(.*)\:(.*)');
REPLACE
Заменяет существующие символы в строке новыми символами.
Синтаксис
| REPLACE(строка, 'regExp', 'newChar'); |
Термины
| строка | Строка, подлежащая обновлению. |
| 'regExp' | Регулярное выражение для сопоставления со строкой, в кавычках. |
| 'newChar' | Новые символы, заменяющие существующие, в кавычках. |
Использование
Используйте функцию REPLACE для замены существующих символов в строке новыми символами.
Например, чтобы изменить "open source software" на "open source wiki", используйте это выражение: REPLACE(строка,'software','wiki')
Обратите внимание, что функция REPLACE внутренне реализуется с помощью java.string.replaceAll(String regex, String replacement), где 'regExp' и 'newChar' передаются в качестве первого и второго аргумента соответственно. Если вы хотите заменить специальные символы, такие как '[', в строковом литерале, необходимо экранировать их в 'regExp', добавив перед ними двойные обратные слеши (например, '\\[').
RTRIM
Возвращает копию строки с удалёнными только заключительными пробелами.
Синтаксис
| RTRIM(выражение) |
Термины
| выражение | Выражение, результатом которого является chararray. |
Использование
Используйте функцию RTRIM для удаления заключительных пробелов из строки.
SPRINTF
Форматирует набор значений в соответствии с шаблоном в стиле printf, используя библиотеку native Java Formatter.
Синтаксис
| SPRINTF(формат, [...значения]) |
Термины
| формат | Строка в стиле printf, описывающая шаблон. |
| значения | Значения для вставки в шаблон. Должен быть элемент кортежа для каждого местаholders форматирования, и он должен иметь правильный тип: int или long для целочисленных форматов, таких как %d; float или double для десятичных форматов, таких как %f; и long для форматов дат/времени, таких как %t. |
Использование
Используйте функцию SPRINTF для форматирования строки в соответствии с шаблоном. Например, SPRINTF("part-%05d", 69) вернёт 'part-00069'.
| Спецификация формата строки | арг1 | арг2 | арг3 | SPRINTF(формат, арг1, арг2) | примечания |
|---|---|---|---|---|---|
| '%8s|%8d|%-8s' | 1234567 | 1234567 | 'yay' | ' 1234567| 1234567|yay ' | Строки форматируются с помощью %s, целые числа с %d. Типы преобразуются при необходимости (здесь int -> строка). |
| (значение null) | 1234567 | 1234567 | 'yay' | (значение null) | Возвращает null (без ошибок или предупреждений) при null формате строки. |
| '%8s|%8d|%-8s' | 1234567 | (значение null) | 'yay' | (значение null) | Возвращает null (без ошибок или предупреждений), если какой-либо аргумент имеет значение null. |
| '%8.3f|%6x' | 123.14159 | 665568 | ' 123.142| a27e0' | Форматирование чисел с плавающей точкой/двойной точностью с помощью %f, шестнадцатеричных целых чисел с помощью %x (есть и другие -- см. документацию Java) | |
| '%,+10d|%(06d' | 1234567 | -123 | '+1,234,567|(0123)' | Для чисел используются префиксы модификаторов: , для разделителей тысяч в соответствии с локалью, 0 для нулевого заполнения; + для всегда отображения знака «плюс» для положительных чисел; пробел для вставки пробела перед положительными числами; ( для указания отрицательных чисел в скобках (в стиле бухгалтерского учета). | |
| '%2$5d: %3$6s %1$3s %2$4x (%<4X)' | 'the' | 48879 | 'wheres' | '48879: wheres the beef (BEEF)' | Ссылайтесь на аргументы позиционно и столько раз, сколько нужно, используя %(pos)$.... Используйте %<... для ссылки на ранее указанный аргумент. |
| 'Launch Time: %14d %s' | ToMilliSeconds(CurrentTime()) | ToString(CurrentTime(), 'yyyy-MM-dd HH:mm:ss Z') | 'Launch Time: 1400164132000 2014-05-15 09:28:52 -0500' | Вместо этого используйте ToString для форматирования даты/времени и SPRINTF для вывода результатов. | |
| '%8s|%-8s' | 1234567 | MissingFormatArgumentException: Format specifier '%-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, limit) |
Термины
| строка | Строка, которая должна быть разделена. |
| regex | Регулярное выражение. |
| limit | Если значение положительное, шаблон (скомпилированное представление регулярного выражения) применяется не более limit-1 раз, поэтому значение аргумента означает максимальную длину кортежа результата. Последний элемент кортежа результата будет содержать весь вход после последнего совпадения. Если значение отрицательное, никаких ограничений на длину кортежа результата не накладывается. Если значение равно нулю, никаких ограничений на длину кортежа результата не накладывается, и завершающие пустые строки (если есть) будут удалены. |
Использование
Используйте функцию STRSPLIT для разделения строки вокруг совпадений заданного регулярного выражения.
Например, для строки (open:source:software), STRSPLIT (строка, ':',2) вернёт ((open,source:software)), а STRSPLIT (строка, ':',3) вернёт ((open,source,software)).
STRSPLITTOBAG
Разделяет строку по совпадениям заданного регулярного выражения и возвращает набор данных.
Синтаксис
| STRSPLITTOBAG(строка, regex, limit) |
Термины
| строка | Строка, которая должна быть разделена. |
| regex | Регулярное выражение. |
| limit | Если значение положительное, шаблон (скомпилированное представление регулярного выражения) применяется не более 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, см. Спецификацию Java API, класс 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. |
Использование
Используйте функцию MinutsBetween для получения количества минут между двумя заданными объектами datetime.
MonthsBetween
Возвращает количество месяцев между двумя объектами DateTime.
Синтаксис
| MonthsBetween(datetime1, datetime2) |
Термины
| datetime1 | Объект datetime. |
| datetime2 | Другой объект datetime. |
Использование
Используйте функцию MonthsBetween для получения количества месяцев между двумя заданными объектами datetime.
SecondsBetween
Возвращает количество секунд между двумя объектами DateTime.
Синтаксис
| SecondsBetween(datetime1, datetime2) |
Термины
| datetime1 | Объект datetime. |
| datetime2 | Другой объект datetime. |
Использование
Используйте функцию SecondsBetween для получения количества секунд между двумя заданными объектами datetime.
SubtractDuration
Возвращает результат вычитания объекта Duration из объекта DateTime.
Синтаксис
| 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 | Строка даты и времени в формате ISO 8601. |
| userstring | Строка даты и времени в пользовательском формате. |
| 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 как целое число long для объекта DateTime. UnixTime — это количество секунд, прошедших с 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 для преобразования пар выражений в словарь. Обратите внимание на следующее:
- Вы должны предоставить чётное количество выражений в качестве параметров
- Элементы должны соответствовать правилам типа словаря:
- Каждый нечётный элемент (key-expression) должен быть типа chararray, так как только chararray могут быть ключами в словаре
- Каждый чётный элемент (value-expression) может быть любого типа, поддерживаемого словарем.
См. также: тип данных словарь и Операторы построения типов
Пример
В этом примере используются имена студентов (тип 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 | Количество возвращаемых верхних кортежей (тип integer). |
| column | Столбец кортежа, значения которого сравниваются (0 обозначает первый столбец). |
| relation | Отношение (множество кортежей), содержащее столбец кортежей. |
Использование
Функция TOP возвращает множество, содержащее верхние N кортежей из входного множества, где N задаётся первым параметром функции. Сравнение кортежей выполняется на основе одного столбца кортежа. Позиция столбца определяется вторым параметром функции. Функция предполагает, что все кортежи в множестве содержат элемент одного и того же типа в сравниваемом столбце.
По умолчанию функция TOP использует порядок убывания. Но он может быть настроен с помощью оператора DEFINE.
DEFINE asc TOP('ASC'); -- ascending order
DEFINE desc TOP('DESC'); -- descending order
Пример
В этом примере возвращаются 10 наиболее часто встречающихся значений.
DEFINE asc TOP('ASC'); -- ascending order
DEFINE desc TOP('DESC'); -- descending order
A = LOAD 'data' as (first: chararray, second: chararray);
B = GROUP A BY (first, second);
C = FOREACH B generate FLATTEN(group), COUNT(A) as count;
D = GROUP C BY first; -- again group by first
topResults = FOREACH D {
result = asc(10, 1, C); -- and retain top 10 (in ascending order) occurrences of 'second' in first
GENERATE FLATTEN(result);
}
bottomResults = FOREACH D {
result = desc(10, 1, C); -- and retain top 10 (in descending order) occurrences of 'second' in first
GENERATE FLATTEN(result);
}
© 2007–2016 Apache Software Foundation
Licensed under the Apache Software License version 2.0.
https://pig.apache.org/docs/r0.14.0/func.html