Встроенные функции
Введение
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, здесь потеряны. Будьте осторожны, если вы используете вызыватели таким образом.
СРЗНАЧ
Вычисляет среднее значение числовых значений в одностолбцовом наборе.
Синтаксис
| СРЗНАЧ(выражение) |
Термины
| выражение | Любое выражение, результат которого является набором. Элементы набора должны быть типа 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, если они не являются таковыми. |
| разделитель | Значение chararray, которое будет вставлено между элементами набора; по умолчанию это знак подчеркивания '_'. |
Использование
BagToString создаёт одну строку из элементов набора, подобно функции GROUP_CONCAT в SQL. Имейте в виду следующее:
- Наборы могут иметь произвольный размер, в то время как строки в Java не могут: вы либо исчерпаете доступную память, либо превысите максимальное количество символов (около 2 миллиардов). Одна из худших особенностей производственной задачи — пороговое поведение: всё будет казаться почти в порядке, пока размер данных вашего самого большого набора не перейдёт от «почти слишком большого» к «впритык слишком большому».
- Наборы не упорядочены, если явно не применена вложенная операция ORDER BY, как показано ниже. Вложенный FOREACH сохранит порядок, позволяя вам отсортировать по одному сочетанию полей, а затем спроецировать только значения, которые вы хотите объединить.
- Применяется преобразование к строке по умолчанию для каждого элемента. Если содержимое наборов не является атомарным (кортеж, карта и т.д.), это может не быть тем, что вам нужно. Используйте вложенный FOREACH для форматирования значений, а затем составьте их с помощью BagToString, как показано ниже.
Примеры:
| vals | разделитель | BagToString(vals, разделитель) | Примечания |
|---|---|---|---|
| {('BOS'),('NYA'),('BAL')} | BOS_NYA_BAL | Если задан только один аргумент, поле разграничивается знаками подчеркивания | |
| {('BOS'),('NYA'),('BAL')} | '|' | BOS|NYA|BAL | Но вы можете указать свой собственный разделитель |
| {('BOS'),('NYA'),('BAL')} | '' | BOSNYABAL | Используйте явную пустую строку, чтобы просто склеить всё вместе |
| {(1),(2),(3)} | '|' | 1|2|3 | Элементы преобразуются в соответствующий тип (но см. примеры ниже) |
Примеры
Простые строки с разделителями простые:
team_parks = LOAD 'team_parks' AS (team_id:chararray, park_id:chararray, years:bag{(year_id:int)});
-- BOS BOS07 {(1995),(1997),(1996),(1998),(1999)}
-- NYA NYC16 {(1995),(1999),(1998),(1997),(1996)}
-- NYA NYC17 {(1998)}
-- SDN HON01 {(1997)}
-- SDN MNT01 {(1996),(1999)}
-- SDN SAN01 {(1999),(1997),(1998),(1995),(1996)}
team_parkslist = FOREACH (GROUP team_parks BY team_id) GENERATE
group AS team_id, BagToString(team_parks.park_id, ';');
-- BOS BOS07
-- NYA NYC17;NYC16
-- SDN SAN01;MNT01;HON01
Обработка сложных элементов по умолчанию работает, но, вероятно, не то, что вы хотите.
team_parkyearsugly = FOREACH (GROUP team_parks BY team_id) GENERATE
group AS team_id,
BagToString(team_parks.(park_id, years));
-- BOS BOS07_{(1995),(1997),(1996),(1998),(1999)}
-- NYA NYC17_{(1998)}_NYC16_{(1995),(1999),(1998),(1997),(1996)}
-- SDN SAN01_{(1999),(1997),(1998),(1995),(1996)}_MNT01_{(1996),(1999)}_HON01_{(1997)}
Вместо этого соберите его по частям. В шаге 2 мы сортируем по одному полю, но обрабатываем другое; оно остаётся в отсортированном порядке.
team_park_yearslist = FOREACH team_parks {
years_o = ORDER years BY year_id;
GENERATE team_id, park_id, SIZE(years_o) AS n_years, BagToString(years_o, '/') AS yearslist;
};
team_parkyearslist = FOREACH (GROUP team_park_yearslist BY team_id) {
tpy_o = ORDER team_park_yearslist BY n_years DESC, park_id ASC;
tpy_f = FOREACH tpy_o GENERATE CONCAT(park_id, ':', yearslist);
GENERATE group AS team_id, BagToString(tpy_f, ';');
};
-- BOS BOS07:1995/1996/1997/1998/1999
-- NYA NYC16:1995/1996/1997/1998/1999;NYC17:1998
-- SDN SAN01:1995/1996/1997/1998/1999;MNT01:1996/1999;HON01:1997
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 в вычисление подсчёта, используйте 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);
МАКС
Вычисляет максимальное значение числовых или 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
Позволяет пользователю указать префикс строки и затем отфильтровать столбцы в отношении, которые начинаются с этого префикса.
Синтаксис
| 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 | возвращает количество пар ключ/значение в 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;
В этом последовательности событий есть проблема. Первый скрипт не определяет типы данных и, как результат, данные сохраняются как массив байтов и пакет с кортежем, содержащим два массива байтов. Второй скрипт пытается преобразовать массив байтов в тип 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( [‘схема’] ) |
| JsonStorage( ) |
Термины
| схема | Необязательная схема Pig, заключенная в одинарные кавычки. |
Использование
Используйте JsonLoader для загрузки данных JSON.
Используйте JsonStorage для сохранения данных JSON.
Обратите внимание, что понятие разделителя отсутствует в JsonLoader или JsonStorage. Данные закодированы в стандартном формате JSON. JsonLoader необязательно принимает схему в качестве аргумента конструкции.
Примеры
В этом примере данные загружаются со схемой.
a = load 'a.json' using JsonLoader('a0:int,a1:{(a10:int,a11:chararray)},a2:(a20:double,a21:bytearray),a3:[chararray]');
В этом примере данные загружаются без схемы; предполагается, что в каталоге входных данных существует .pig_schema (сгенерированная JsonStorage).
a = load 'a.json' using JsonLoader();
PigDump
Сохраняет данные в формате UTF-8.
Синтаксис
| PigDump() |
Термины
| нет | нет параметров |
Использование
PigDump сохраняет данные в виде кортежей в удобочитаемом формате UTF-8.
Пример
В этом примере PigDump используется с функцией STORE.
STORE X INTO 'output' USING PigDump();
PigStorage
Загружает и сохраняет данные в виде структурированных текстовых файлов.
Синтаксис
| PigStorage( [разделитель_полей] , ['опции'] ) |
Термины
| разделитель_полей | По умолчанию разделитель полей — табуляция ('\t'). Вы можете указать другие символы в качестве разделителей полей; однако, обязательно заключайте символы в одинарные кавычки. |
| 'опции' | Строка, содержащая разделенные пробелами опции (‘опцияA опцияB опцияC’) В настоящее время поддерживаемые опции:
|
Использование
PigStorage — это функция по умолчанию, используемая Pig для загрузки/сохранения данных. PigStorage поддерживает структурированные текстовые файлы (в удобочитаемом формате UTF-8) в сжатом или несжатом виде (см. Обработку сжатия). Все типы данных Pig (data types) (простые и сложные) могут быть загружены/сохранены с помощью этой функции. Входные данные для загрузки могут быть файлом, каталогом или шаблоном.
Заявления о загрузке/сохранении
Заявления о загрузке — PigStorage ожидает, что данные будут отформатированы с использованием разделителей полей, либо символа табуляции ('\t'), либо другого указанного символа.
Заявления о сохранении — PigStorage выводит данные, используя разделители полей, либо символ табуляции ('\t'), либо другой указанный символ, и разделитель строк ('\n').
Разделители полей/строк
Разделители полей — По умолчанию разделитель полей — табуляция ('\t'). Вы можете использовать другие символы в качестве разделителей полей, но разделители, такие как ^A или Ctrl-A, должны быть представлены в Unicode (\u0001) с кодировкой UTF-16 (см. Wikipedia ASCII, Unicode и UTF-16).
Разделители строк — Для заявлений о загрузке Pig интерпретирует символы новой строки ( '\n' ), возврата каретки ( '\r' или CTRL-M) и комбинацию CR + LF ( '\r\n' ) в качестве разделителей строк (не используйте эти символы в качестве разделителей полей). Для заявлений о сохранении Pig использует символ новой строки ('\n') в качестве разделителя строк.
Схемы
Если указана опция схемы, при сохранении данных в выходном каталоге создается скрытый файл ".pig_schema". Он используется PigStorage (с или без -schema) при загрузке для определения имен и типов полей данных без необходимости явного указания схемы в предложении as, если не указано noschema. При загрузке не предпринимается попытка объединения противоречивых схем. Используется первая схема, обнаруженная во время сканирования файловой системы.
Кроме того, если указана опция схемы, в выходном каталоге создается файл ".pig_headers". Этот файл просто перечисляет алиасы, разделенные разделителями. Это призвано упростить экспорт в инструменты, которые могут читать файлы с заголовками (просто добавьте заголовок к вашим данным).
Если опция схемы НЕ указана, схема не будет записана при сохранении данных.
Если опция noschema НЕ указана, а схема найдена, она загружается при загрузке данных.
Обратите внимание, что независимо от того, сохраняете ли вы схему, вам всегда необходимо указать правильный разделитель для чтения данных. Если вы сохраняете с использованием разделителя "#" и затем загружаете с использованием разделителя по умолчанию, ваши данные не будут правильно распарсены.
Происхождение записей
Если указана опция tagPath или tagFile, PigStorage добавит псевдостолбец INPUT_FILE_PATH или INPUT_FILE_NAME соответственно в начало записи. Как следует из названия, это путь/имя входного файла, содержащий эту конкретную запись. Обратите внимание, что tagsource устарел.
Сложные типы данных
Форматы сложных типов данных показаны здесь:
- Кортеж: заключен в (), элементы разделены ","
- Непустой кортеж: (элемент1,элемент2,элемент3)
- Пустой кортеж допустим: ()
- Пакет: заключен в {}, кортежи разделены ","
- Непустой пакет: {code}{(кортеж1),(кортеж2),(кортеж3)}{code}
- Пустой пакет допустим: {}
- Словарь: заключен в [], элементы разделены ",", ключ и значение разделены "#"
- Непустой словарь: [ключ1#значение1,ключ2#значение2]
- Пустой словарь допустим: []
Если в заявлении о загрузке указана схема, Pig преобразует сложный тип в соответствии со схемой. Если преобразование завершится ошибкой, затронутый элемент будет равен null (см. Nulls и 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
ЗагрузчикТекста
Загружает неструктурированные данные в формате 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']) |
Термины
| schema | JSON-строка, определяющая схему Avro для входных данных. Вы можете указать явную схему при сохранении данных или при загрузке данных. Когда вы вручную предоставляете схему, Pig будет использовать предоставленную схему для сериализации и десериализации. Это означает, что вы можете предоставить явную схему при сохранении данных, чтобы упростить вывод (например, удаляя необязательные объединения) или переименовывать поля. Это также означает, что вы можете предоставить явную схему при чтении данных, чтобы читать только подмножество полей в каждом записях. См. документацию Apache Avro для получения дополнительной информации о том, как указать допустимую схему. |
| record name | При сохранении мешка кортежей с AvroStorage, если вы не хотите указывать полную схему, вы можете указать имя avro-записи вместо этого. (AvroStorage определит, что аргумент не является допустимым определением схемы, и использует его как имя переменной вместо.) |
| 'options' | Строка, содержащая разделенные пробелами параметры (‘-optionA valueA -optionB valueB -optionC ’) В настоящее время поддерживаются следующие параметры:
|
Использование
AvroStorage хранит и загружает данные из файлов Avro. Часто вы можете загружать и сохранять данные с помощью AvroStorage, не зная много о формате сериализации Avro. AvroStorage будет пытаться автоматически преобразовать pig-схему и данные pig в данные avro или данные avro в данные pig.
По умолчанию, когда вы используете AvoStorage для загрузки данных, AvroStorage будет использовать поиск по глубине для поиска корректного файла Avro по пути ввода, а затем использовать схему из этого файла для загрузки данных. Когда вы используете AvroStorage для сохранения данных, AvroStorage будет пытаться преобразовать Pig-схему в эквивалентную Avro-схему. Вы можете вручную указать схему, предоставив явную схему в Pig, загрузив схему из внешнего файла схемы или явно сказав Pig читать схему из определенного файла avro.
Для сжатия выходных данных с AvroStorage необходимо использовать соответствующие свойства Avro для сжатия. Например, для включения сжатия с помощью deflate уровня 5, вы бы указали
SET avro.output.codec 'deflate' SET avro.mapred.deflate.level 5
Допустимые значения для avro.output.codec включают deflate, snappy и null.
Существует несколько ключевых отличий между данными Avro и Pig, и в некоторых случаях полезно понимать различия между моделями данных Avro и Pig. Перед записью данных Pig в Avro (или созданием файлов Avro для использования в Pig), имейте в виду, что для каждой Pig-схемы может не быть эквивалентной Avro-схемы (и наоборот):
- Определения рекурсивных схем Вы не можете определять схемы рекурсивно в Pig, но вы можете определять схемы рекурсивно в Avro.
- Разрешенные символы Схемы Pig иногда могут содержать символы, такие как двоеточие (":"), которые недопустимы в именах Avro.
- Объединения В Avro вы можете определить объект, который может быть одним из нескольких разных типов (включая сложные типы, такие как записи). В Pig этого нельзя сделать.
- Перечисления Avro позволяет определять перечисления для эффективного и абстрактного представления категориальных переменных, но Pig этого не поддерживает.
- Массивы байтов фиксированной длины Avro позволяет определять массивы байтов фиксированной длины, но Pig этого не поддерживает.
- Значения с возможностью null В Pig все типы могут иметь значение null. В Avro этого нет.
Вот как AvroStorage преобразует значения Pig в Avro:
| Исходный тип Pig | Преобразованный тип Avro | |
| Целые числа | int | ["int","null"] |
| Длинные целые | long | ["long,"null"] |
| Числа с плавающей точкой | float | ["float","null"] |
| Числа с двойной точностью | double | ["double","null"] |
| Строки | chararray | ["string","null"] |
| Байты | bytearray | ["bytes","null"] |
| Булевы значения | boolean | ["boolean","null"] |
| Кортежи | tuple | Схема Pig Tuple будет преобразована в объединение Avro-записи с эквивалентной схемой и null. |
| Множества кортежей | bag | Схема Pig Tuple будет преобразована в объединение массива записей с эквивалентной схемой и null. |
| Словари | map | Схема Pig Tuple будет преобразована в объединение словаря записей с эквивалентной схемой и null. |
Вот как AvroStorage преобразует значения Avro в Pig:
| Исходные типы Avro | Преобразованный тип Pig | |
| Целые числа | ["int","null"] или "int" | int |
| Длинные целые | ["long,"null"] или "long" | long |
| Числа с плавающей точкой | ["float","null"] или "float" | float |
| Числа с двойной точностью | ["double","null"] или "double" | double |
| Строки | ["string","null"] или "string" | chararray |
| Перечисления | Либо перечисление, либо объединение перечисления и null | chararray |
| Байты | ["bytes","null"] или "bytes" | bytearray |
| Фиксированные | Либо массив байтов фиксированной длины, либо объединение массива фиксированной длины и null | bytearray |
| Булевы значения | ["boolean","null"] или "boolean" | boolean |
| Кортежи | Либо тип записи, либо объединение записи и null | tuple |
| Множества кортежей | Либо массив, либо объединение массива и null | bag |
| Словари | Либо словарь, либо объединение словаря и null | map |
Во многих случаях AvroStorage автоматически правильно преобразует данные, и вам не нужно предоставлять AvroStorage дополнительной информации. Но иногда может быть удобно вручную указать схему для 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:{measurement:(label:chararray,value:int)}
Чтобы сохранить этот набор в файл с именем "измерения", вы можете использовать оператор:
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 для LOAD или сериализации Map в группу семейств или квалификаторов столбцов при STORE.
Синтаксис
| AccumuloStorage(['columns'[, 'options']]) |
Аргументы
| 'columns' | Список "столбцов", разделённых запятыми, для чтения/записи данных. Каждый из этих столбцов может быть одного из трёх типов:
Литеральное значение: это самое простое указание, которое представляет собой строку, разделённую двоеточием, отображающую семейство столбцов и квалификатор столбца. Это позволит читать/записывать простую скалярную величину из/в Accumulo. Префикс семейства столбцов: при чтении данных это позволит получить данные из Accumulo Key-Value в текущей строке, семейства столбцов которых соответствуют данному префиксу. Это приведёт к размещению Map в кортеже. При записи данных также ожидается Map в заданном смещении в кортеже, ключи которого будут добавлены к префиксу семейства столбцов, используется пустой квалификатор столбца, а значение Map будет помещено в Accumulo Value. Действительным префиксом семейства столбцов является литеральная звёздочка (*) в этом случае ключ Map будет эквивалентен семейству столбцов Accumulo. Префикс квалификатора столбцов: аналогично префиксу семейства столбцов, но он работает с квалификатором столбца. При чтении Accumulo Key-Value в той же строке, которые соответствуют данному семейству столбцов и префиксу квалификатора столбца, будут помещены в один Map. При записи данные семейство столбцов из спецификации столбца будут использоваться, ключ Map будет добавлен к квалификатору столбца, указанному в спецификации, и значение Map будет Accumulo Value. Если "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». В этом примере ключ строки, который является уникальным кодом аэропорта, присваивается переменной «код», а все остальные столбцы помещаются в карту. Когда квалификатор столбца не пустой, ключ в этой карте будет иметь двоеточие, которое отделяет часть ключа, взятую из семейства столбцов, от части ключа, взятой из квалификатора столбца. Значение 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.
Функции математики
Для общей информации об этих функциях см. спецификацию Java API, Class 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
Возвращает десятичный логарифм выражения.
Синтаксис
| LOG10(expression) |
Термины
| expression | Выражение, результатом которого является тип double. |
Использование
Используйте функцию LOG10 для возврата десятичного логарифма выражения.
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(val, digits) |
|---|---|---|---|
| 1234.1789 | 8 | 1234.1789 | |
| 1234.1789 | 4 | 1234.1789 | |
| 1234.1789 | 1 | 1234.2 | |
| 1234.1789 | 0 | 1234.0 | |
| 1234.1789 | -1 | 1230.0 | |
| 1234.1789 | -3 | 1000.0 | |
| 1234.1789 | -4 | 0.0 | |
| 3.25000001 | 1 | 3.3 | |
| 3.25 | 1 | 3.2 | |
| -3.25 | 1 | -3.2 | |
| 3.15 | 1 | 3.2 | |
| -3.15 | 1 | -3.2 | |
| 3.25 | 1 | 4 | 3.3 |
| -3.25 | 1 | 4 | -3.3 |
| 3.5 | 0 | 4.0 | |
| -3.5 | 0 | -4.0 | |
| 2.5 | 0 | 2.0 | |
| -2.5 | 0 | -2.0 | |
| 3.5 | 0 | 4 | 4.0 |
| -3.5 | 0 | 4 | -4.0 |
| 2.5 | 0 | 4 | 3.0 |
| -2.5 | 0 | 4 | -3.0 |
SIN
Возвращает синус выражения.
Синтаксис
| SIN(expression) |
Термины
| expression | Выражение, результатом которого является double. |
Использование
Используйте функцию SIN для возврата синуса выражения.
SINH
Возвращает гиперболический синус выражения.
Синтаксис
| SINH(expression) |
Термины
| expression | Выражение, результатом которого является double. |
Использование
Используйте функцию SINH для возврата гиперболического синуса выражения.
SQRT
Возвращает положительный квадратный корень из выражения.
Синтаксис
| SQRT(expression) |
Термины
| expression | Выражение, результатом которого является double. |
Использование
Используйте функцию SQRT для возврата положительного квадратного корня из выражения.
TAN
Возвращает тригонометрический тангенс угла.
Синтаксис
| TAN(expression) |
Термины
| expression | Выражение (угол), результатом которого является double. |
Использование
Используйте функцию TAN для возврата тригонометрического тангенса угла.
TANH
Возвращает гиперболический тангенс выражения.
Синтаксис
| TANH(expression) |
Термины
| expression | Выражение, результатом которого является double. |
Использование
Используйте функцию TANH для возврата гиперболического тангенса выражения.
Строковые функции
Для общей информации об этих функциях, см. Java API Specification, Class String. Обратите внимание на следующее:
-
Имена функций Pig чувствительны к регистру и записываются заглавными буквами.
-
Функции строк Pig имеют дополнительный первый параметр: строка, к которой применяются все операции.
-
Pig может обрабатывать результаты по-другому, чем указано в Java API Specification. Если любой из входных параметров равен null или если предоставлено недостаточное количество параметров, возвращается NULL.
ENDSWITH
Проверяет входные данные, чтобы определить, заканчивается ли первый аргумент строкой во втором.
Синтаксис
| ENDSWITH(строка, сравнение) |
Термины
| строка | Строка, которая проверяется. |
| сравнение | Строка, с которой производится сравнение. |
Использование
Используйте функцию ENDSWITH, чтобы определить, заканчивается ли первый аргумент строкой во втором.
Например, ENDSWITH ('foobar', 'foo') вернёт false, а ENDSWITH ('foobar', 'bar') вернёт true.
EqualsIgnoreCase
Сравнивает две строки, игнорируя регистр.
Синтаксис
| EqualsIgnoreCase(строка1, строка2) |
Термины
| строка1 | Исходная строка. |
| строка2 | Строка для сравнения. |
Использование
Используйте функцию EqualsIgnoreCase, чтобы определить, равны ли две строки, игнорируя регистр.
INDEXOF
Возвращает индекс первого вхождения символа в строке, выполняя поиск вперёд с заданного индекса.
Синтаксис
| INDEXOF(строка, 'символ', начальныйИндекс) |
Термины
| строка | Строка, в которой выполняется поиск. |
| 'символ' | Искомый символ, в кавычках. |
| начальныйИндекс | Индекс, с которого начинается поиск вперёд. Индекс строки начинается с нуля (0). |
Использование
Используйте функцию INDEXOF, чтобы определить индекс первого вхождения символа в строке. Поиск вперёд символа начинается с указанного начального индекса.
LAST_INDEX_OF
Возвращает индекс последнего вхождения символа в строке, выполняя поиск назад от конца строки.
Синтаксис
| LAST_INDEX_OF(строка, 'символ') |
Термины
| строка | Строка, в которой выполняется поиск. |
| 'символ' | Искомый символ, в кавычках. |
Использование
Используйте функцию LAST_INDEX_OF, чтобы определить индекс последнего вхождения символа в строке. Поиск назад символа начинается с конца строки.
LCFIRST
Преобразует первый символ в строке в нижний регистр.
Синтаксис
| LCFIRST(выражение) |
Термины
| выражение | Выражение, результат которого имеет тип chararray. |
Использование
Используйте функцию LCFIRST, чтобы преобразовать только первый символ строки в нижний регистр.
LOWER
Преобразует все символы в строке в нижний регистр.
Синтаксис
| LOWER(выражение) |
Термины
| выражение | Выражение, результат которого имеет тип chararray. |
Использование
Используйте функцию LOWER, чтобы преобразовать все символы в строке в нижний регистр.
LTRIM
Возвращает копию строки со удалёнными только начальными пробелами.
Синтаксис
| LTRIM(выражение) |
Термины
| выражение | Выражение, результат которого - chararray. |
Использование
Используйте функцию LTRIM, чтобы удалить начальные пробелы из строки.
REGEX_EXTRACT
Выполняет сопоставление с регулярным выражением и извлекает сопоставленную группу, определённую индексным параметром.
Синтаксис
| REGEX_EXTRACT (строка, регулярноеВыражение, индекс) |
Термины
| строка | Строка, в которой выполняется сопоставление. |
| регулярноеВыражение | Регулярное выражение. |
| индекс | Индекс сопоставленной группы для возврата. |
Использование
Используйте функцию REGEX_EXTRACT для выполнения сопоставления с регулярным выражением и извлечения сопоставленной группы, определённой индексным параметром (где индекс — параметр с основанием 1). Функция использует форму регулярных выражений Java.
Функция возвращает строку, соответствующую сопоставленной группе в заданной позиции по индексу. Если по этому индексу нет сопоставленного выражения, возвращается NULL.
Пример
Этот пример вернёт строку '192.168.1.5'.
REGEX_EXTRACT('192.168.1.5:8020', '(.*):(.*)', 1);
REGEX_EXTRACT_ALL
Выполняет сопоставление с регулярным выражением и извлекает все сопоставленные группы.
Синтаксис
| REGEX_EXTRACT_ALL (строка, регулярноеВыражение) |
Термины
| строка | Строка, в которой выполняется сопоставление. |
| регулярноеВыражение | Регулярное выражение. |
Использование
Используйте функцию REGEX_EXTRACT_ALL для выполнения сопоставления с регулярным выражением и извлечения всех сопоставленных групп. Функция использует форму регулярных выражений Java.
Функция возвращает кортеж, где каждый элемент представляет сопоставленное выражение. Если сопоставлений нет, возвращается пустой кортеж.
Пример
Этот пример вернёт кортеж (192.168.1.5,8020).
REGEX_EXTRACT_ALL('192.168.1.5:8020', '(.*)\:(.*)');
REPLACE
Заменяет существующие символы в строке новыми.
Синтаксис
| REPLACE(строка, 'регулярноеВыражение', 'новыйСимвол'); |
Термины
| строка | Строка, которая обновляется. |
| 'регулярноеВыражение' | Регулярное выражение, с которым сравнивается строка, в кавычках. |
| 'новыйСимвол' | Новые символы, заменяющие существующие, в кавычках. |
Использование
Используйте функцию REPLACE для замены существующих символов в строке новыми.
Например, чтобы изменить "open source software" на "open source wiki", используйте это выражение: REPLACE(строка,'software','wiki')
Обратите внимание, что функция REPLACE внутренне реализуется с помощью java.string.replaceAll(String regex, String replacement), где 'регулярноеВыражение' и 'новыйСимвол' передаются в качестве 1-го и 2-го аргумента соответственно. Если вы хотите заменить специальные символы, такие как '[', в строковой литерале, необходимо экранировать их в 'регулярноеВыражение', добавив перед ними двойные обратные слэши (например, '\\[').
RTRIM
Возвращает копию строки со удалёнными только конечными пробелами.
Синтаксис
| RTRIM(выражение) |
Термины
| выражение | Выражение, результат которого - chararray. |
Использование
Используйте функцию RTRIM, чтобы удалить конечные пробелы из строки.
STARTSWITH
Проверяет входные данные, чтобы определить, начинается ли первый аргумент со строки во втором.
Синтаксис
| STARTSWITH(строка, сравнение) |
Термины
| строка | Строка, которая проверяется. |
| сравнение | Строка, с которой производится сравнение. |
Использование
Используйте функцию STARTSWITH, чтобы определить, начинается ли первый аргумент со строки во втором.
Например, STARTSWITH ('foobar', 'foo') вернёт true, а STARTSWITH ('foobar', 'bar') вернёт false.
STRSPLIT
Разделяет строку по соответствиям заданному регулярному выражению.
Синтаксис
| STRSPLIT(строка, регулярноеВыражение, предел) |
Термины
| строка | Строка, которая должна быть разделена. |
| regex | Регулярное выражение. |
| предел | Если значение положительное, шаблон (скомпилированное представление регулярного выражения) применяется не более limit-1 раз, следовательно, значение аргумента означает максимальную длину кортежа результата. Последний элемент кортежа результата будет содержать весь входной текст после последнего совпадения. Если значение отрицательное, для длины кортежа результата ограничений нет. Если значение равно нулю, для длины кортежа результата ограничений также нет, и пустые строки (если таковые имеются) будут удалены. |
Использование
Используйте функцию STRSPLIT для разделения строки по совпадениям заданного регулярного выражения.
Например, для строки (open:source:software), STRSPLIT (строка, ':',2) вернёт ((open,source:software)), а STRSPLIT (строка, ':',3) вернёт ((open,source,software)).
SUBSTRING
Возвращает подстроку из заданной строки.
Синтаксис
| SUBSTRING(строка, начальныйИндекс, конечныйИндекс) |
Термины
| строка | Строка, из которой будет извлечена подстрока. |
| начальныйИндекс | Индекс (тип целое число) первой буквы подстроки. Индекс строки начинается с нуля (0). |
| конечныйИндекс | Индекс (тип целое число) символа, следующего за последним символом подстроки. |
Использование
Используйте функцию SUBSTRING для возвращения подстроки из заданной строки.
Для поля с именем alpha, значение которого ABCDEF, чтобы вернуть подстроку BCD, используйте это выражение: SUBSTRING(alpha,1,4). Обратите внимание, что 1 – это индекс B (первого символа подстроки), а 4 – индекс E (символа, следующего за последним символом подстроки).
TRIM
Возвращает копию строки с удаленными начальными и конечными пробелами.
Синтаксис
| TRIM(выражение) |
Термины
| выражение | Выражение, результатом которого является строка. |
Использование
Используйте функцию TRIM для удаления начальных и конечных пробелов из строки.
UCFIRST
Возвращает строку с первой буквой, преобразованной в верхний регистр.
Синтаксис
| UCFIRST(выражение) |
Термины
| выражение | Выражение, результатом которого является строка. |
Использование
Используйте функцию UCFIRST для преобразования только первой буквы в строке в верхний регистр.
UPPER
Возвращает строку, преобразованную в верхний регистр.
Синтаксис
| UPPER(выражение) |
Термины
| выражение | Выражение, результатом которого является строка. |
Использование
Используйте функцию UPPER для преобразования всех символов строки в верхний регистр.
Функции работы со временем
Для получения общей информации об операциях с типами 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(миллисекунды) ToDate(isostring) ToDate(userstring, формат) ToDate(userstring, формат, часовой пояс) |
Термины
| миллисекунды | Смещение от 1970-01-01T00:00:00.000Z в миллисекундах (положительное или отрицательное). |
| isostring | Строка даты и времени в формате ISO 8601. |
| userstring | Строка даты и времени в формате, заданном пользователем. |
| формат | Шаблон формата даты и времени (см. класс Java SimpleDateFormat). |
| часовой пояс | Строка часового пояса. Можно использовать смещение UTC и формат, основанный на местоположении, в качестве параметра; внутренне часовой пояс будет преобразован в формат смещения UTC. См. документацию Joda-Time для доступных идентификаторов часовых поясов. |
Использование
Используйте функцию ToDate для генерации объекта DateTime. Обратите внимание, что если часовой пояс не указан в строке даты и времени ISO или в параметре часового пояса, будет использован часовой пояс по умолчанию.
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. Unix Time — это количество секунд, прошедших с 1 января 1970 года 00:00:00.000 по Гринвичу.
Синтаксис
| ToUnixTime(datetime) |
Термины
| datetime | Объект datetime. |
Использование
Используйте функцию ToUnixTime для преобразования DateTime в Unix Time.
WeeksBetween
Возвращает количество недель между двумя объектами DateTime.
Синтаксис
| WeeksBetween(datetime1, datetime2) |
Термины
| datetime1 | Объект datetime. |
| datetime2 | Другой объект datetime. |
Использование
Используйте функцию WeeksBetween для получения количества недель между двумя заданными объектами datetime.
YearsBetween
Возвращает количество лет между двумя объектами DateTime.
Синтаксис
| YearsBetween(datetime1, datetime2) |
Термины
| datetime1 | Объект datetime. |
| datetime2 | Другой объект datetime. |
Использование
Используйте функцию YearsBetween для получения количества лет между двумя заданными объектами datetime.
Функции кортежей, множеств и словарей
TOTUPLE
Преобразует одно или несколько выражений в тип кортеж.
Синтаксис
| TOTUPLE(выражение [, выражение ...]) |
Термины
| выражение | Выражение любого типа данных. |
Использование
Используйте функцию 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, так как только chararrays могут быть ключами в словаре.
- Каждый чётный элемент (выражение-значение) может быть любого типа, поддерживаемого словарем.
См. также: Тип данных словарь и Операторы построения типов
Пример
В этом примере имена студентов (тип 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 задаётся первым параметром функции. Сравнение кортежей выполняется на основе значения в заданном столбце кортежа. Номер столбца определяется вторым параметром функции. Функция предполагает, что все кортежи в множестве содержат элемент одного типа в сравниваемом столбце.
Пример
В этом примере возвращаются 10 наиболее частых случаев.
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 = TOP(10, 1, C); // and retain top 10 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.13.0/func.html