SlideShare a Scribd company logo
1 of 34
Download to read offline
Pig и Hive
Pig
Что такое Pig?
• Pig – высокоуровневая платформа поверх Hadoop
– Язык программирования высокого уровня Pig Latin
– Код программы преобразуется в MapReduce задачи
• Разработан в Yahoo! в 2006 году
• Top Level Apache Project
– http://pig.apache.org
Для чего нужен Pig?
• Для написания задач MapReduce требуются
программисты
– Которые должны уметь думать в стиле “map & reduce”
– Скорее всего должны знать язык Java
• Pig предоставляет язык, который могут использовать:
– Аналитики
– Data Scientists
– Статистики
public class WordCountJob extends Configured implements Tool{
static public class WordCountMapper
extends Mapper<LongWritable, Text, Text, IntWritable>{
private final static IntWritableone = new IntWritable(1);
private final Text word = new Text();
@Override
protected void map(LongWritablekey, Text value, Context context)
throws IOException, InterruptedException{
StringTokenizer tokenizer = new StringTokenizer(value.toString());
while (tokenizer.hasMoreTokens()){
text.set(tokenizer.nextToken());
context.write(text, one);
}
}
}
static public class WordCountReducer
extends Reducer<Text, IntWritable,Text, IntWritable>{
@Override
protected void reduce(Text key, Iterable<IntWritable>values,
Context context)
throws IOException, InterruptedException{
int sum = 0;
for (IntWritable value : values) {
sum += value.get();
}
context.write(key, new IntWritable(sum));
}
}
@Override
public int run(String[] args) throws Exception {
Job job = Job.getInstance(getConf(), "WordCount");
job.setJarByClass(getClass());
TextInputFormat.addInputPath(job, new Path(args[0]));
job.setInputFormatClass(TextInputFormat.class);
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
job.setCombinerClass(WordCountReducer.class);
TextOutputFormat.setOutputPath(job, new Path(args[1]));
job.setOutputFormatClass(TextOutputFormat.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
return job.waitForCompletion(true)? 0 : 1;
}
public static void main(String[] args) throws Exception {
int exitCode = ToolRunner.run(
new WordCountJob(), args);
System.exit(exitCode);
}
}
#!/usr/bin/python
import sys
for line in sys.stdin:
for token in line.strip().split(" "):
if token: print token + 't1'
#!/usr/bin/python
import sys
(lastKey, sum)=(None, 0)
for line in sys.stdin:
(key, value) = line.strip().split("t")
if lastKey and lastKey != key:
print lastKey + 't' + str(sum)
(lastKey, sum) = (key, int(value))
else:
(lastKey, sum) = (key, sum + int(value))
if lastKey:
print lastKey + 't' + str(sum)
1. input_lines = LOAD ‘copy-of-all-pages-on-internet' AS (line:chararray);
2. words = FOREACH input_lines GENERATE
FLATTEN(TOKENIZE(line)) AS word;
3. word_groups = GROUP words BY word;
4. word_count = FOREACH word_groups GENERATE
COUNT(filtered_words) AS count, group AS word;
5. STORE word_count INTO ‘number-of-words-on-internet';
Java: ~50 строк
Python: 17 строк
Pig: 5 строк
Основные возможности Pig
• Join Datasets
• Sort Datasets
• Filter
• Data Types
• Group By
• Пользовательские функции
Компоненты Pig
• Pig Latin
• Компилятор Pig
• Среда выполнения
Режимы выполнения
• Local
– Запускается в рамках одной JVM
– Работает исключительно с локальной файловой
системой
– $pig -x local
• Hadoop (MapReduce)
– Pig преобразует программу Pig Latin в задачи
MapReduce и выполняет их на кластере
– $pig -x mapreduce
Запуск Pig
• Скрипт
– Выполняются команды из файла
– $pig script.pig
• Grunt
– Интерактивная оболочка для выполнения команд Pig
– Можно запускать скрипты из Grunt командой run или exec
• Embedded
– Можно выполнять команды Pig, используя класс PigServer
– Имеется программный доступ к Grunt через класс PigRunner
Pig Latin
Строительные блоки
– Field (поле) – часть данных
– Tuple (кортеж) – упорядоченный набор полей,
заключенный в скобки “(” и “)”
– Bag (мешок) – коллекция кортежей,
заключенная в скобки “{” и “}”
(10.4, 5, word, 4, field1)
{ (10.4, 5, word, 4, field1), (this, 1, blah) }
Pig Latin
Схожесть с реляционными БД:
– Bag – это таблица в БД
– Tuple – это строка в таблице
– Но: Bag не требует, чтобы все tuples содержали
одно и то же число полей
$ pig
grunt> cat /path/to/file/a.txt
a 1
d 4
c 9
k 6
grunt> records = LOAD ‘/path/to/file/a.txt' as (letter:chararray, count:int);
grunt> DUMP records;
...
org.apache.pig.backend.hadoop.executionengine.MapReduceLauncher - 50% complete
org.apache.pig.backend.hadoop.executionengine.MapReduceLauncher - 100% complete
...
(a,1)
(d,4)
(c,9)
(k,6)
Операции DUMP и STORE
DUMP – выводит результат на экран
STORE – сохраняет результат (обычно в файл)
grunt> records = LOAD ‘/path/to/file/a.txt' as (letter:chararray, count:int);
...
...
...
...
grunt> DUMP records;
Ничего не выполняется,
только оптимизация скрипта
Большой объем данных
Можно ограничить объем выводимых данных
grunt> records = LOAD ‘/path/to/file/big.txt' as (letter:chararray, count:int);
grunt> toPrint = LIMIT records 5;
grunt> DUMP toPrint;
Показывать только 5 записей
data – имя директории или файла
USING – определяет функцию для загрузки
AS – назначает схему входным данным
LOAD 'data' [USING function] [AS schema];
records =
LOAD '/path/to/file/some.log'
USING PigStorage(’;’)
AS (userId:chararray, timestamp:long, query:chararray);
Тип Описание Пример
Простые
int Signed 32-bit integer 10
long Signed 64-bit integer 10L или 10l
float 32-bit floating point 10.5F или 10.5f
double 64-bit floating point 10.5 или 10.5e2 или 10.5E2
Массивы
chararray Массив символов (string) в Unicode UTF-8 hello world
bytearray Byte array (blob)
Комплексные
tuple ordered set of fields (19,2)
bag collection of tuples {(19,2), (18,1)}
map set of key value pairs [open#apache]
Pig Latin: средства диагностики
• Отобразить структуру Bag
– grunt> DESCRIBE <bag_name>;
• Отобразить план выполнения (Execution Plan)
– grunt> EXPLAIN <bag_name>;
• Показать, как Pig преобразует данные
– grunt> ILLUSTRATE <bag_name>;
grunt> chars = LOAD '/path/to/file/b.txt' AS (c:chararray);
grunt> DESCRIBE chars;
chars: {c: chararray}
grunt> DUMP chars;
(a)
(k)
...
(c)
(k)
grunt> charGroup = GROUP chars by c;
grunt> DESCRIBE charGroup;
charGroup: {group: chararray,chars: {(c: chararray)}}
grunt> dump charGroup;
(a,{(a),(a),(a)})
(c,{(c),(c)})
(i,{(i),(i),(i)})
(k,{(k),(k),(k),(k)})
(l,{(l),(l)})
‘chars’ – это bag, который содержит
все tuples из bag ‘chars’, которые
матчат значение из ‘c’
Создать новый bag с
полями group и chars
grunt> chars = LOAD ‘/path/to/file/b.txt' AS (c:chararray);
grunt> charGroup = GROUP chars by c;
grunt> ILLUSTRATE charGroup;
------------------------------
| chars | c:chararray |
------------------------------
| | c |
| | c |
------------------------------
------------------------------------------------------------------------------------
| charGroup | group:chararray | chars:bag{:tuple(c:chararray)} |
------------------------------------------------------------------------------------
| | c | {(c), (c)} |
-------------------------------------------------------------------------------------
grunt> chars = LOAD '/path/to/file/b.txt' AS (c:chararray);
grunt> charGroup = GROUP chars by c;
grunt> dump charGroup;
(a, {(a), (a), (a)})
(c, {(c), (c)})
(i, {(i), (i), (i)})
(k, {(k), (k), (k), (k)})
(l, {(l), (l)})
grunt> records = LOAD ‘/path/to/file/a.txt' AS (c:chararray, i:int);
grunt> DUMP records;
(a,1)
(d,4)
(c,9)
(k,6)
grunt> counts = FOREACH records GENERATE i;
grunt> DUMP counts;
(1)
(4)
(9)
(6)
Для каждой строки
вывести поле ‘i’
FOREACH <bag> GENERATE <data>
PigLatin: FOREACH с функцией
• Встроенные функции Pig:
– COUNT, FLATTEN, CONCAT и т.д.
• Можно реализовать свою функцию
– Java, Python, JavaScript, Ruby или Groovy
FOREACH B GENERATE group, FUNCTION(A);
grunt> chars = LOAD 'data/b.txt' AS (c:chararray);
grunt> charGroup = GROUP chars BY c;
grunt> DUMP charGroup;
(a, {(a),(a),(a)})
(c, {(c),(c)})
(i, {(i),(i),(i)})
(k, {(k),(k),(k),(k)})
(l, {(l),(l)})
grunt> DESCRIBE charGroup;
charGroup: {group: chararray,chars: {(c: chararray)}}
grunt> counts = FOREACH charGroup GENERATE group, COUNT(chars);
grunt> DUMP counts;
(a,3)
(c,2)
(i,3)
(k,4)
(l,2)
Для каждой строки в ‘charGroup’
вывести поле ‘group’ и число
элементов в ‘chars’
PigLatin: функция TOKENIZE
• Разбиение строки на токены
• Результат в виде bag из токенов
• Разделители:
– пробел
– кавычки: “
– запятая: ,
– скобки: ()
– звездочка: *
tokenBag = FOREACH Text GENERATE TOKENIZE(line);
grunt> linesOfText = LOAD 'data/c.txt' AS (line:chararray);
grunt> DUMP linesOfText;
(this is a line of text)
(yet another line of text)
(third line of words)
grunt> tokenBag = FOREACH linesOfText GENERATE TOKENIZE(line);
grunt> DUMP tokenBag;
({(this),(is),(a),(line),(of),(text)})
({(yet),(another),(line),(of),(text)})
({(third),(line),(of),(words)})
grunt> DESCRIBE tokenBag;
tokenBag: {bag_of_tokenTuples: {tuple_of_tokens: (token:
chararray)}}
Разбить каждую строку по
пробелам и вернуть bag of
tokens
grunt> DUMP tokenBag;
({(this), (is), (a), (line), (of), (text)})
({(yet), (another), (line), (of), (text)})
({(third), (line), (of), (words)})
grunt> flatBag = FOREACH tokenBag GENERATE flatten($0);
grunt> DUMP flatBag;
(this)
(is)
(a)
...
...
(text)
(third)
(line)
(of)
(words)
Каждая строка
раскладывается в bag
простых токенов
input_lines = LOAD ‘file-with-text' AS (line:chararray);
words = FOREACH input_lines GENERATE FLATTEN(TOKENIZE(line)) AS word;
filtered_words = FILTER words BY word MATCHES 'w+';
word_groups = GROUP filtered_words BY word;
word_count = FOREACH word_groups GENERATE COUNT(filtered_words) AS count,
group AS word;
ordered_word_count = ORDER word_count BY count DESC;
STORE ordered_word_count INTO ‘number-of-words-file';
PigLatin: WordCount
PigLatin: Joins
• Pig поддерживает
– Inner Joins (по-умолчанию)
– Outer Joins
– Full Joins
• Фазы join
– Загрузить записи в bag из input #1
– Загрузить записи в bag из input #2
– Сделать join для двух массивов данных (bags) по
заданному ключу
Inner Join, пример
-- InnerJoin.pig
-- Загрузить записи в bag #1
posts = LOAD ‘data/user-posts.txt' USING PigStorage(',') AS
(user:chararray,post:chararray,date:long);
-- Загрузить записи в bag #2
likes = LOAD ‘data/user-likes.txt' USING PigStorage(',') AS
(user:chararray,likes:int,date:long);
userInfo = JOIN posts BY user, likes BY user;
DUMP userInfo;
$ hdfs dfs –cat data/user-posts.txt
user1,Funny Story,1343182026191
user2,Cool Deal,1343182133839
user4,Interesting Post,1343182154633
user5,Yet Another Blog,13431839394
$ hdfs dfs –cat data/user-likes.txt
user1,12,1343182026191
user2,7,1343182139394
user3,0,1343182154633
user4,50,1343182147364
$ pig InnerJoin.pig
(user1,Funny Story,1343182026191,user1,12,1343182026191)
(user2,Cool Deal,1343182133839,user2,7,1343182139394)
(user4,Interesting Post,1343182154633,user4,50,1343182147364)
grunt> DESCRIBE posts;
posts: {user: chararray,post: chararray,date: long}
grunt> DESCRIBE likes;
likes: {user: chararray,likes: int,date: long}
grunt> DESCRIBE userInfo;
UserInfo: {
posts::user: chararray,
posts::post: chararray,
posts::date: long,
likes::user: chararray,
likes::likes: int,
likes::date: long}
Inner Join, пример
PigLatin: Outer Join
• JOIN <bag #1> BY <join field>
LEFT OUTER, <bag #2> BY <join field>;
• JOIN <bag #1> BY <join field>
RIGHT OUTER, <bag #2> BY <join field>;
• JOIN <bag #1> BY <join field>
FULL OUTER, <bag #2> BY <join field>;
Left Outer Join, пример
--LeftOuterJoin.pig
posts = LOAD ‘data/user-posts.txt‘
USING PigStorage(',')
AS (user:chararray,post:chararray,date:long);
likes = LOAD ‘data/user-likes.txt'
USING PigStorage(',')
AS (user:chararray,likes:int,date:long);
userInfo = JOIN posts BY user LEFT OUTER, likes BY user;
DUMP userInfo;
$ hdfs dfs –cat data/user-posts.txt
user1,Funny Story,1343182026191
user2,Cool Deal,1343182133839
user4,Interesting Post,1343182154633
user5,Yet Another Blog,13431839394
$ hdfs dfs –cat data/user-likes.txt
user1,12,1343182026191
user2,7,1343182139394
user3,0,1343182154633
user4,50,1343182147364
$ pig LeftOuterJoin.pig
(user1,Funny Story,1343182026191,user1,12,1343182026191)
(user2,Cool Deal,1343182133839,user2,7,1343182139394)
(user4,Interesting Post,1343182154633,user4,50,1343182147364)
(user5,Yet Another Blog,13431839394,,,)

More Related Content

What's hot

Опыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхОпыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхVasil Remeniuk
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARNTechnopark
 
Apache Spark — Егор Пахомов
Apache Spark — Егор ПахомовApache Spark — Егор Пахомов
Apache Spark — Егор ПахомовYandex
 
Hadoop implementation in Wikimart
Hadoop implementation in WikimartHadoop implementation in Wikimart
Hadoop implementation in WikimartRoman Zykov
 
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в TarantoolИнструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в TarantoolTimur Safin
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс СерверPVasili
 
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...Badoo Development
 
Hacking PostgreSQL. Физическое представление данных
Hacking PostgreSQL. Физическое представление данныхHacking PostgreSQL. Физическое представление данных
Hacking PostgreSQL. Физическое представление данныхAnastasia Lubennikova
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы HadoopTechnopark
 
DrupalCafe #1: Екатерина Маршалкина - Права на файлы Drupal в Unix-системах
DrupalCafe #1: Екатерина Маршалкина - Права на файлы Drupal в Unix-системахDrupalCafe #1: Екатерина Маршалкина - Права на файлы Drupal в Unix-системах
DrupalCafe #1: Екатерина Маршалкина - Права на файлы Drupal в Unix-системахDrupalSPB
 
Расширения для PostgreSQL
Расширения для PostgreSQLРасширения для PostgreSQL
Расширения для PostgreSQLAnastasia Lubennikova
 
Hacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаHacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаAnastasia Lubennikova
 
PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?Ivan Tsyganov
 
Clojure – есть ли жизнь после Java
Clojure – есть ли жизнь после JavaClojure – есть ли жизнь после Java
Clojure – есть ли жизнь после JavaOlim Saidov
 
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Ontico
 
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Anastasia Lubennikova
 
Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15Alexey Zinoviev
 
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Ontico
 
О безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersО безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersPositive Hack Days
 

What's hot (20)

Опыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхОпыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событиях
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARN
 
Apache Spark — Егор Пахомов
Apache Spark — Егор ПахомовApache Spark — Егор Пахомов
Apache Spark — Егор Пахомов
 
Hadoop implementation in Wikimart
Hadoop implementation in WikimartHadoop implementation in Wikimart
Hadoop implementation in Wikimart
 
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в TarantoolИнструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс Сервер
 
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
 
Hacking PostgreSQL. Физическое представление данных
Hacking PostgreSQL. Физическое представление данныхHacking PostgreSQL. Физическое представление данных
Hacking PostgreSQL. Физическое представление данных
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
 
DrupalCafe #1: Екатерина Маршалкина - Права на файлы Drupal в Unix-системах
DrupalCafe #1: Екатерина Маршалкина - Права на файлы Drupal в Unix-системахDrupalCafe #1: Екатерина Маршалкина - Права на файлы Drupal в Unix-системах
DrupalCafe #1: Екатерина Маршалкина - Права на файлы Drupal в Unix-системах
 
Расширения для PostgreSQL
Расширения для PostgreSQLРасширения для PostgreSQL
Расширения для PostgreSQL
 
Hacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаHacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кода
 
PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?
 
Clojure – есть ли жизнь после Java
Clojure – есть ли жизнь после JavaClojure – есть ли жизнь после Java
Clojure – есть ли жизнь после Java
 
Big Data и Ruby
Big Data и RubyBig Data и Ruby
Big Data и Ruby
 
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
 
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
 
Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15
 
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
 
О безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersО безопасном использовании PHP wrappers
О безопасном использовании PHP wrappers
 

Similar to 09 - Hadoop. Pig

Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveTechnopark
 
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelЛекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelMikhail Kurnosov
 
Язык параллельного программирования Cray Chapel
Язык параллельного программирования Cray ChapelЯзык параллельного программирования Cray Chapel
Язык параллельного программирования Cray ChapelMikhail Kurnosov
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
 
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python Meetup
 
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodRust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodNikita Baksalyar
 
Hadoop presentation
Hadoop presentationHadoop presentation
Hadoop presentationVlad Orlov
 
Root Conf2009 Fin
Root Conf2009 FinRoot Conf2009 Fin
Root Conf2009 FinLiudmila Li
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Technopark
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовAndrew Shitov
 
Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Ontico
 
Разработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIРазработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIIlya Chesnokov
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
 
Tarantool Modules, Tarantool Meetup 2016-08-25
Tarantool Modules, Tarantool Meetup 2016-08-25Tarantool Modules, Tarantool Meetup 2016-08-25
Tarantool Modules, Tarantool Meetup 2016-08-25Roman Tsisyk
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
Linux basics. Занятие 3.
Linux basics. Занятие 3. Linux basics. Занятие 3.
Linux basics. Занятие 3. Vikentsi Lapa
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Vladimir Kochetkov
 

Similar to 09 - Hadoop. Pig (20)

Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и Hive
 
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelЛекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
 
Язык параллельного программирования Cray Chapel
Язык параллельного программирования Cray ChapelЯзык параллельного программирования Cray Chapel
Язык параллельного программирования Cray Chapel
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
 
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodRust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny Novgorod
 
Hadoop presentation
Hadoop presentationHadoop presentation
Hadoop presentation
 
Root Conf2009 Fin
Root Conf2009 FinRoot Conf2009 Fin
Root Conf2009 Fin
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)
 
Perl in practice
Perl in practicePerl in practice
Perl in practice
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистов
 
Bytecode
BytecodeBytecode
Bytecode
 
Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)
 
Разработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIРазработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PI
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
Tarantool Modules, Tarantool Meetup 2016-08-25
Tarantool Modules, Tarantool Meetup 2016-08-25Tarantool Modules, Tarantool Meetup 2016-08-25
Tarantool Modules, Tarantool Meetup 2016-08-25
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
Linux basics. Занятие 3.
Linux basics. Занятие 3. Linux basics. Занятие 3.
Linux basics. Занятие 3.
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!
 
842302.pptx
842302.pptx842302.pptx
842302.pptx
 

More from Roman Brovko

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task NetworkingRoman Brovko
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3Roman Brovko
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernetRoman Brovko
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2Roman Brovko
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1Roman Brovko
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flashRoman Brovko
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2CRoman Brovko
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uartRoman Brovko
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorRoman Brovko
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwmRoman Brovko
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsRoman Brovko
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_worldRoman Brovko
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisitesRoman Brovko
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advancedRoman Brovko
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advancedRoman Brovko
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advancedRoman Brovko
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окруженияRoman Brovko
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advancedRoman Brovko
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basicsRoman Brovko
 

More from Roman Brovko (20)

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task Networking
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernet
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flash
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
 
Glesk worshop
Glesk worshopGlesk worshop
Glesk worshop
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensor
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwm
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttons
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_world
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisites
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advanced
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advanced
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advanced
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advanced
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basics
 

09 - Hadoop. Pig

  • 2. Pig
  • 3. Что такое Pig? • Pig – высокоуровневая платформа поверх Hadoop – Язык программирования высокого уровня Pig Latin – Код программы преобразуется в MapReduce задачи • Разработан в Yahoo! в 2006 году • Top Level Apache Project – http://pig.apache.org
  • 4. Для чего нужен Pig? • Для написания задач MapReduce требуются программисты – Которые должны уметь думать в стиле “map & reduce” – Скорее всего должны знать язык Java • Pig предоставляет язык, который могут использовать: – Аналитики – Data Scientists – Статистики
  • 5. public class WordCountJob extends Configured implements Tool{ static public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{ private final static IntWritableone = new IntWritable(1); private final Text word = new Text(); @Override protected void map(LongWritablekey, Text value, Context context) throws IOException, InterruptedException{ StringTokenizer tokenizer = new StringTokenizer(value.toString()); while (tokenizer.hasMoreTokens()){ text.set(tokenizer.nextToken()); context.write(text, one); } } } static public class WordCountReducer extends Reducer<Text, IntWritable,Text, IntWritable>{ @Override protected void reduce(Text key, Iterable<IntWritable>values, Context context) throws IOException, InterruptedException{ int sum = 0; for (IntWritable value : values) { sum += value.get(); } context.write(key, new IntWritable(sum)); } } @Override public int run(String[] args) throws Exception { Job job = Job.getInstance(getConf(), "WordCount"); job.setJarByClass(getClass()); TextInputFormat.addInputPath(job, new Path(args[0])); job.setInputFormatClass(TextInputFormat.class); job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); job.setCombinerClass(WordCountReducer.class); TextOutputFormat.setOutputPath(job, new Path(args[1])); job.setOutputFormatClass(TextOutputFormat.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); return job.waitForCompletion(true)? 0 : 1; } public static void main(String[] args) throws Exception { int exitCode = ToolRunner.run( new WordCountJob(), args); System.exit(exitCode); } } #!/usr/bin/python import sys for line in sys.stdin: for token in line.strip().split(" "): if token: print token + 't1' #!/usr/bin/python import sys (lastKey, sum)=(None, 0) for line in sys.stdin: (key, value) = line.strip().split("t") if lastKey and lastKey != key: print lastKey + 't' + str(sum) (lastKey, sum) = (key, int(value)) else: (lastKey, sum) = (key, sum + int(value)) if lastKey: print lastKey + 't' + str(sum) 1. input_lines = LOAD ‘copy-of-all-pages-on-internet' AS (line:chararray); 2. words = FOREACH input_lines GENERATE FLATTEN(TOKENIZE(line)) AS word; 3. word_groups = GROUP words BY word; 4. word_count = FOREACH word_groups GENERATE COUNT(filtered_words) AS count, group AS word; 5. STORE word_count INTO ‘number-of-words-on-internet'; Java: ~50 строк Python: 17 строк Pig: 5 строк
  • 6. Основные возможности Pig • Join Datasets • Sort Datasets • Filter • Data Types • Group By • Пользовательские функции
  • 7. Компоненты Pig • Pig Latin • Компилятор Pig • Среда выполнения
  • 8. Режимы выполнения • Local – Запускается в рамках одной JVM – Работает исключительно с локальной файловой системой – $pig -x local • Hadoop (MapReduce) – Pig преобразует программу Pig Latin в задачи MapReduce и выполняет их на кластере – $pig -x mapreduce
  • 9. Запуск Pig • Скрипт – Выполняются команды из файла – $pig script.pig • Grunt – Интерактивная оболочка для выполнения команд Pig – Можно запускать скрипты из Grunt командой run или exec • Embedded – Можно выполнять команды Pig, используя класс PigServer – Имеется программный доступ к Grunt через класс PigRunner
  • 10. Pig Latin Строительные блоки – Field (поле) – часть данных – Tuple (кортеж) – упорядоченный набор полей, заключенный в скобки “(” и “)” – Bag (мешок) – коллекция кортежей, заключенная в скобки “{” и “}” (10.4, 5, word, 4, field1) { (10.4, 5, word, 4, field1), (this, 1, blah) }
  • 11. Pig Latin Схожесть с реляционными БД: – Bag – это таблица в БД – Tuple – это строка в таблице – Но: Bag не требует, чтобы все tuples содержали одно и то же число полей
  • 12. $ pig grunt> cat /path/to/file/a.txt a 1 d 4 c 9 k 6 grunt> records = LOAD ‘/path/to/file/a.txt' as (letter:chararray, count:int); grunt> DUMP records; ... org.apache.pig.backend.hadoop.executionengine.MapReduceLauncher - 50% complete org.apache.pig.backend.hadoop.executionengine.MapReduceLauncher - 100% complete ... (a,1) (d,4) (c,9) (k,6)
  • 13. Операции DUMP и STORE DUMP – выводит результат на экран STORE – сохраняет результат (обычно в файл) grunt> records = LOAD ‘/path/to/file/a.txt' as (letter:chararray, count:int); ... ... ... ... grunt> DUMP records; Ничего не выполняется, только оптимизация скрипта
  • 14. Большой объем данных Можно ограничить объем выводимых данных grunt> records = LOAD ‘/path/to/file/big.txt' as (letter:chararray, count:int); grunt> toPrint = LIMIT records 5; grunt> DUMP toPrint; Показывать только 5 записей
  • 15. data – имя директории или файла USING – определяет функцию для загрузки AS – назначает схему входным данным LOAD 'data' [USING function] [AS schema]; records = LOAD '/path/to/file/some.log' USING PigStorage(’;’) AS (userId:chararray, timestamp:long, query:chararray);
  • 16. Тип Описание Пример Простые int Signed 32-bit integer 10 long Signed 64-bit integer 10L или 10l float 32-bit floating point 10.5F или 10.5f double 64-bit floating point 10.5 или 10.5e2 или 10.5E2 Массивы chararray Массив символов (string) в Unicode UTF-8 hello world bytearray Byte array (blob) Комплексные tuple ordered set of fields (19,2) bag collection of tuples {(19,2), (18,1)} map set of key value pairs [open#apache]
  • 17. Pig Latin: средства диагностики • Отобразить структуру Bag – grunt> DESCRIBE <bag_name>; • Отобразить план выполнения (Execution Plan) – grunt> EXPLAIN <bag_name>; • Показать, как Pig преобразует данные – grunt> ILLUSTRATE <bag_name>;
  • 18. grunt> chars = LOAD '/path/to/file/b.txt' AS (c:chararray); grunt> DESCRIBE chars; chars: {c: chararray} grunt> DUMP chars; (a) (k) ... (c) (k) grunt> charGroup = GROUP chars by c; grunt> DESCRIBE charGroup; charGroup: {group: chararray,chars: {(c: chararray)}} grunt> dump charGroup; (a,{(a),(a),(a)}) (c,{(c),(c)}) (i,{(i),(i),(i)}) (k,{(k),(k),(k),(k)}) (l,{(l),(l)}) ‘chars’ – это bag, который содержит все tuples из bag ‘chars’, которые матчат значение из ‘c’ Создать новый bag с полями group и chars
  • 19. grunt> chars = LOAD ‘/path/to/file/b.txt' AS (c:chararray); grunt> charGroup = GROUP chars by c; grunt> ILLUSTRATE charGroup; ------------------------------ | chars | c:chararray | ------------------------------ | | c | | | c | ------------------------------ ------------------------------------------------------------------------------------ | charGroup | group:chararray | chars:bag{:tuple(c:chararray)} | ------------------------------------------------------------------------------------ | | c | {(c), (c)} | -------------------------------------------------------------------------------------
  • 20. grunt> chars = LOAD '/path/to/file/b.txt' AS (c:chararray); grunt> charGroup = GROUP chars by c; grunt> dump charGroup; (a, {(a), (a), (a)}) (c, {(c), (c)}) (i, {(i), (i), (i)}) (k, {(k), (k), (k), (k)}) (l, {(l), (l)})
  • 21. grunt> records = LOAD ‘/path/to/file/a.txt' AS (c:chararray, i:int); grunt> DUMP records; (a,1) (d,4) (c,9) (k,6) grunt> counts = FOREACH records GENERATE i; grunt> DUMP counts; (1) (4) (9) (6) Для каждой строки вывести поле ‘i’ FOREACH <bag> GENERATE <data>
  • 22. PigLatin: FOREACH с функцией • Встроенные функции Pig: – COUNT, FLATTEN, CONCAT и т.д. • Можно реализовать свою функцию – Java, Python, JavaScript, Ruby или Groovy FOREACH B GENERATE group, FUNCTION(A);
  • 23. grunt> chars = LOAD 'data/b.txt' AS (c:chararray); grunt> charGroup = GROUP chars BY c; grunt> DUMP charGroup; (a, {(a),(a),(a)}) (c, {(c),(c)}) (i, {(i),(i),(i)}) (k, {(k),(k),(k),(k)}) (l, {(l),(l)}) grunt> DESCRIBE charGroup; charGroup: {group: chararray,chars: {(c: chararray)}} grunt> counts = FOREACH charGroup GENERATE group, COUNT(chars); grunt> DUMP counts; (a,3) (c,2) (i,3) (k,4) (l,2) Для каждой строки в ‘charGroup’ вывести поле ‘group’ и число элементов в ‘chars’
  • 24. PigLatin: функция TOKENIZE • Разбиение строки на токены • Результат в виде bag из токенов • Разделители: – пробел – кавычки: “ – запятая: , – скобки: () – звездочка: * tokenBag = FOREACH Text GENERATE TOKENIZE(line);
  • 25. grunt> linesOfText = LOAD 'data/c.txt' AS (line:chararray); grunt> DUMP linesOfText; (this is a line of text) (yet another line of text) (third line of words) grunt> tokenBag = FOREACH linesOfText GENERATE TOKENIZE(line); grunt> DUMP tokenBag; ({(this),(is),(a),(line),(of),(text)}) ({(yet),(another),(line),(of),(text)}) ({(third),(line),(of),(words)}) grunt> DESCRIBE tokenBag; tokenBag: {bag_of_tokenTuples: {tuple_of_tokens: (token: chararray)}} Разбить каждую строку по пробелам и вернуть bag of tokens
  • 26. grunt> DUMP tokenBag; ({(this), (is), (a), (line), (of), (text)}) ({(yet), (another), (line), (of), (text)}) ({(third), (line), (of), (words)}) grunt> flatBag = FOREACH tokenBag GENERATE flatten($0); grunt> DUMP flatBag; (this) (is) (a) ... ... (text) (third) (line) (of) (words) Каждая строка раскладывается в bag простых токенов
  • 27. input_lines = LOAD ‘file-with-text' AS (line:chararray); words = FOREACH input_lines GENERATE FLATTEN(TOKENIZE(line)) AS word; filtered_words = FILTER words BY word MATCHES 'w+'; word_groups = GROUP filtered_words BY word; word_count = FOREACH word_groups GENERATE COUNT(filtered_words) AS count, group AS word; ordered_word_count = ORDER word_count BY count DESC; STORE ordered_word_count INTO ‘number-of-words-file'; PigLatin: WordCount
  • 28. PigLatin: Joins • Pig поддерживает – Inner Joins (по-умолчанию) – Outer Joins – Full Joins • Фазы join – Загрузить записи в bag из input #1 – Загрузить записи в bag из input #2 – Сделать join для двух массивов данных (bags) по заданному ключу
  • 29. Inner Join, пример -- InnerJoin.pig -- Загрузить записи в bag #1 posts = LOAD ‘data/user-posts.txt' USING PigStorage(',') AS (user:chararray,post:chararray,date:long); -- Загрузить записи в bag #2 likes = LOAD ‘data/user-likes.txt' USING PigStorage(',') AS (user:chararray,likes:int,date:long); userInfo = JOIN posts BY user, likes BY user; DUMP userInfo;
  • 30. $ hdfs dfs –cat data/user-posts.txt user1,Funny Story,1343182026191 user2,Cool Deal,1343182133839 user4,Interesting Post,1343182154633 user5,Yet Another Blog,13431839394 $ hdfs dfs –cat data/user-likes.txt user1,12,1343182026191 user2,7,1343182139394 user3,0,1343182154633 user4,50,1343182147364 $ pig InnerJoin.pig (user1,Funny Story,1343182026191,user1,12,1343182026191) (user2,Cool Deal,1343182133839,user2,7,1343182139394) (user4,Interesting Post,1343182154633,user4,50,1343182147364)
  • 31. grunt> DESCRIBE posts; posts: {user: chararray,post: chararray,date: long} grunt> DESCRIBE likes; likes: {user: chararray,likes: int,date: long} grunt> DESCRIBE userInfo; UserInfo: { posts::user: chararray, posts::post: chararray, posts::date: long, likes::user: chararray, likes::likes: int, likes::date: long} Inner Join, пример
  • 32. PigLatin: Outer Join • JOIN <bag #1> BY <join field> LEFT OUTER, <bag #2> BY <join field>; • JOIN <bag #1> BY <join field> RIGHT OUTER, <bag #2> BY <join field>; • JOIN <bag #1> BY <join field> FULL OUTER, <bag #2> BY <join field>;
  • 33. Left Outer Join, пример --LeftOuterJoin.pig posts = LOAD ‘data/user-posts.txt‘ USING PigStorage(',') AS (user:chararray,post:chararray,date:long); likes = LOAD ‘data/user-likes.txt' USING PigStorage(',') AS (user:chararray,likes:int,date:long); userInfo = JOIN posts BY user LEFT OUTER, likes BY user; DUMP userInfo;
  • 34. $ hdfs dfs –cat data/user-posts.txt user1,Funny Story,1343182026191 user2,Cool Deal,1343182133839 user4,Interesting Post,1343182154633 user5,Yet Another Blog,13431839394 $ hdfs dfs –cat data/user-likes.txt user1,12,1343182026191 user2,7,1343182139394 user3,0,1343182154633 user4,50,1343182147364 $ pig LeftOuterJoin.pig (user1,Funny Story,1343182026191,user1,12,1343182026191) (user2,Cool Deal,1343182133839,user2,7,1343182139394) (user4,Interesting Post,1343182154633,user4,50,1343182147364) (user5,Yet Another Blog,13431839394,,,)