La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Gestión de Datos (Masivos) Diplomado de Datos 2017 Clase 3: Pig

Presentaciones similares


Presentación del tema: "Gestión de Datos (Masivos) Diplomado de Datos 2017 Clase 3: Pig"— Transcripción de la presentación:

1 Gestión de Datos (Masivos) Diplomado de Datos 2017 Clase 3: Pig
Aidan Hogan

2 Hadoop: Para concluir

3 0. Leer de/Escribir a HDFS
Accede al sistema de archivos con la configuración por defecto Verifica que el archivo exista; si es así, se borra Crea un archivo y escribe un mensaje Abre el archivo y lo lee de nuevo

4 Hadoop: Ejemplo de citas
¿Citas totales por artículo?

5 1. Entrada

6 2. Map Mapper<InputKey, InputValue, MapKey, MapValue>
(entrada) key: posición en el archivo en bytes (entrada) value: línea del archivo output: salida y logging Escribe la salida

7 (Writable para valores)
Mismo orden (no es necesario para el ejemplo actual)

8 (WritableComparable para llaves/valores)
Nueva interfaz Como antes Para ordenar las llaves Usada para la partición por defecto (no es necesario para el ejemplo actual)

9 3. Partición Interfaz del Partitioner
(Este método es igual al método por defecto, pero podemos implementar cualquier lógica para la partición.) (no es necesario para el ejemplo actual)

10 4. Transmisión ("Shuffle")

11 5. Ordenamiento Métodos en WritableComparable
(no es necesario para el ejemplo actual)

12 6. Reducción Reducer<MapKey, MapValue, OutputKey, OutputValue>
key: como fue emitido antes values: todos los valores para la llave actual output Escribe a la salida

13 7. Salida

14 Flujo de control Crea una tarea con la configuración por defecto
Entrada y salida Los tipos de salida de la reducción y el mapeo (respectivamente) La clase de mapeo La clase de reducción (opcional: y de combiner) Ejecuta la tarea y espera su terminación

15 Más cosas en Hadoop: Conteos
Context tiene un mapa de contadores nombre → contador Cada contador es un mapa valor → conteo

16 Hadoop: El ejemplo del supermercado
¿Ventas totales por hora?

17 Más cosas en Hadoop: Varias entradas
Varias entradas, mapeos diferentes Una reducción

18 Más cosas en Hadoop: Encadenar tareas
Ejecuta y espera La salida del job1 dada como la entrada del job2

19 Más cosas en Hadoop: Número de reductores
Configura el número de reductores para la tarea ¿Para qué usaríamos un reductor? Si la salida requiere toda la salida en una máquina final (por ejemplo, totales, top-k)

20 Hadoop: El ejemplo del supermercado
¿Ventas totales por hora? ... pero excluyendo algunos productos listados en un archivo?

21 Más cosas de Hadoop: Caché distribuida
Algunas tareas necesitan datos globales Pero los datos globales deberían ser concisos Usar una caché distribuida: Distribuye los datos globales a cada máquina Disponible en el disco duro local de cada máquina ¿Cómo podríamos usar esta caché? Compartir la lista de productos filtrados, la cual podemos leer (¿en memoria?) en cada máquina

22 Dentro de Apache Hadoop

23 Apache Pig: Un paneo general

24 Hadoop: (ಠ_ಠ)

25 Apache Pig Crea tareas de Hadoop
Usa un lenguaje de “scripting” de alto nivel llamado Pig Latin Puede integrar funciones definidas por el usuario: llamar a una función en Java (o Python, Ruby, etc.) Basado en Relaciones de Pig

26 Pig Latin: Conteo de palabras
input_lines = LOAD '/tmp/book.txt' AS (line:chararray); -- extraer palabras de cada línea y ponerlas en un "saco" de Pig, -- después desanidar el saco para crear una palabra por línea words = FOREACH input_lines GENERATE FLATTEN(TOKENIZE(line)) AS word; -- filtrar las palabras que tengan sólo espacio en blanco filtered_words = FILTER words BY word MATCHES '\\w+'; -- agrupar por palabra word_groups = GROUP filtered_words BY word; -- contar los valores en cada grupo word_count = FOREACH word_groups GENERATE COUNT(filtered_words) AS count, group AS word; -- ordenar las palabras por conteo ordered_word_count = ORDER word_count BY count DESC; STORE ordered_word_count INTO '/tmp/book-word-count.txt'; Map Reduce Map + Reduce ¿Alguna idea de cuáles líneas corresponden a un mapeo y cuáles a una reducción?

27 Apache Pig: Un ejemplo más complejo

28 Pig: Productos por hora
transact.txt customer412 1L_Leche T08:47:57Z $900 customer412 Nescafe T08:47:57Z $2.000 customer g_Zanahoria T08:48:03Z $1.240 customer413 El_Mercurio T08:48:03Z $500 customer413 Gillette_Mach T08:48:03Z $8.250 customer413 Santo_Domingo T08:48:03Z $2.450 customer413 Nescafe T08:48:03Z $2.000 customer414 Rosas T08:48:24Z $7.000 customer414 Chocolates T08:48:24Z $9.230 customer g_Frutillas T08:48:24Z $1.230 customer415 Nescafe T08:48:35Z $2.000 customer Huevos T08:48:35Z $2.200 … Encontrar el número de artículos vendidos por hora ...

29 Pig: Productos por hora
grunt> REGISTER userDefinedFunctions.jar; Funciones definidas por el usuario, escritas en Java (o Python, Ruby, etc. …) User Defined Function = UDF userDefinedFunctions.jar

30 Pig: Productos por hora
grunt> REGISTER userDefinedFunctions.jar; grunt> raw = LOAD ‘transact.txt' USING PigStorage('\t') AS (cust, item, time, price); cust item time price customer412 1L_Leche T08:47:57Z $900 Nescafe $2.000 customer413 400g_Zanahoria T08:48:03Z $1.240 raw:

31 Pig: Productos por hora
grunt> REGISTER userDefinedFunctions.jar; grunt> raw = LOAD ‘transact.txt' USING PigStorage('\t') AS (cust, item, time, price); cust item time price customer412 1L_Leche T08:47:57Z $900 Nescafe $2.000 customer413 400g_Zanahoria T08:48:03Z $1.240 raw:

32 Pig: Productos por hora
grunt> REGISTER userDefinedFunctions.jar; grunt> raw = LOAD ‘transact.txt' USING PigStorage('\t') AS (cust, item, time, price); grunt> premium = FILTER raw BY org.udf.MinPrice1000(price); cust item time price customer412 Nescafe T08:47:57Z $2.000 customer413 400g_Zanahoria T08:48:03Z $1.240 Gillette_Mach3 $8.250 premium:

33 Pig: Productos por hora
grunt> REGISTER userDefinedFunctions.jar; grunt> raw = LOAD ‘transact.txt' USING PigStorage('\t') AS (cust, item, time, price); grunt> premium = FILTER raw BY org.udf.MinPrice1000(price); cust item time price customer412 Nescafe T08:47:57Z $2.000 customer413 400g_Zanahoria T08:48:03Z $1.240 Gillette_Mach3 $8.250 premium:

34 Pig: Productos por hora
grunt> REGISTER userDefinedFunctions.jar; grunt> raw = LOAD ‘transact.txt' USING PigStorage('\t') AS (cust, item, time, price); grunt> premium = FILTER raw BY org.udf.MinPrice1000(price); grunt> hourly = FOREACH premium GENERATE cust, item, org.udf.ExtractHour(time) AS hour, price; cust item hour price customer412 Nescafe 08 $2.000 customer413 400g_Zanahoria $1.240 Gillette_Mach3 $8.250 hourly:

35 Pig: Productos por hora
grunt> REGISTER userDefinedFunctions.jar; grunt> raw = LOAD ‘transact.txt' USING PigStorage('\t') AS (cust, item, time, price); grunt> premium = FILTER raw BY org.udf.MinPrice1000(price); grunt> hourly = FOREACH premium GENERATE cust, item, org.udf.ExtractHour(time) AS hour, price; cust item hour price customer412 Nescafe 08 $2.000 customer413 400g_Zanahoria $1.240 Gillette_Mach3 $8.250 hourly:

36 Pig: Productos por hora
grunt> REGISTER userDefinedFunctions.jar; grunt> raw = LOAD ‘transact.txt' USING PigStorage('\t') AS (cust, item, time, price); grunt> premium = FILTER raw BY org.udf.MinPrice1000(price); grunt> hourly = FOREACH premium GENERATE cust, item, org.udf.ExtractHour(time) AS hour, price; grunt> unique = DISTINCT hourly; cust item hour price customer412 Nescafe 08 $2.000 customer413 400g_Zanahoria $1.240 Gillette_Mach3 $8.250 Santo_Domingo $2.450 unique:

37 Pig: Productos por hora
grunt> REGISTER userDefinedFunctions.jar; grunt> raw = LOAD ‘transact.txt' USING PigStorage('\t') AS (cust, item, time, price); grunt> premium = FILTER raw BY org.udf.MinPrice1000(price); grunt> hourly = FOREACH premium GENERATE cust, item, org.udf.ExtractHour(time) AS hour, price; grunt> unique = DISTINCT hourly; cust item hour price customer412 Nescafe 08 $2.000 customer413 400g_Zanahoria $1.240 Gillette_Mach3 $8.250 Santo_Domingo $2.450 unique:

38 Pig: Productos por hora
grunt> REGISTER userDefinedFunctions.jar; grunt> raw = LOAD ‘transact.txt' USING PigStorage('\t') AS (cust, item, time, price); grunt> premium = FILTER raw BY org.udf.MinPrice1000(price); grunt> hourly = FOREACH premium GENERATE cust, item, org.udf.ExtractHour(time) AS hour, price; grunt> unique = DISTINCT hourly; grunt> hrItem = GROUP unique BY (item, hour); [item,hour] cust item hour price [Nescafe,08] customer412 Nescafe 08 $2.000 customer413 customer415 [400g_Zanahoria,08] 400g_Zanahoria $1.240 hrItem:

39 Pig: Productos por hora
grunt> REGISTER userDefinedFunctions.jar; grunt> raw = LOAD ‘transact.txt' USING PigStorage('\t') AS (cust, item, time, price); grunt> premium = FILTER raw BY org.udf.MinPrice1000(price); grunt> hourly = FOREACH premium GENERATE cust, item, org.udf.ExtractHour(time) AS hour, price; grunt> unique = DISTINCT hourly; grunt> hrItem = GROUP unique BY (item, hour); [item,hour] cust item hour price [Nescafe,08] customer412 Nescafe 08 $2.000 customer413 customer415 [400g_Zanahoria,08] 400g_Zanahoria $1.240 hrItem:

40 Pig: Productos por hora
grunt> REGISTER userDefinedFunctions.jar; grunt> raw = LOAD ‘transact.txt' USING PigStorage('\t') AS (cust, item, time, price); grunt> premium = FILTER raw BY org.udf.MinPrice1000(price); grunt> hourly = FOREACH premium GENERATE cust, item, org.udf.ExtractHour(time) AS hour, price; grunt> unique = DISTINCT hourly; grunt> hrItem = GROUP unique BY (item, hour); grunt> hrItemCnt = FOREACH hrItem GENERATE flatten($0), COUNT($1) AS count; [item,hour] count [400g_Zanahoria,08] 1 [Nescafe,08] 3 hrItemCnt:

41 Pig: Productos por hora
grunt> REGISTER userDefinedFunctions.jar; grunt> raw = LOAD ‘transact.txt' USING PigStorage('\t') AS (cust, item, time, price); grunt> premium = FILTER raw BY org.udf.MinPrice1000(price); grunt> hourly = FOREACH premium GENERATE cust, item, org.udf.ExtractHour(time) AS hour, price; grunt> unique = DISTINCT hourly; grunt> hrItem = GROUP unique BY (item, hour); grunt> hrItemCnt = FOREACH hrItem GENERATE flatten($0), COUNT($1) AS count; grunt> hrItemCntSorted = ORDER hrItemCnt BY count DESC; [item,hour] count [Nescafe,08] 3 [400g_Zanahoria,08] 1 hrItemCntSorted:

42 Pig: Productos por hora
grunt> REGISTER userDefinedFunctions.jar; grunt> raw = LOAD ‘transact.txt' USING PigStorage('\t') AS (cust, item, time, price); grunt> premium = FILTER raw BY org.udf.MinPrice1000(price); grunt> hourly = FOREACH premium GENERATE cust, item, org.udf.ExtractHour(time) AS hour, price; grunt> unique = DISTINCT hourly; grunt> hrItem = GROUP unique BY (item, hour); grunt> hrItemCnt = FOREACH hrItem GENERATE flatten($0), COUNT($1) AS count; grunt> hrItemCntSorted = ORDER hrItemCnt BY count DESC; grunt> STORE hrItemCntSorted INTO ‘output.txt’; [item,hour] count [Nescafe,08] 3 [400g_Zanahoria,08] 1 hrItemCntSorted:

43 Apache Pig: Esquema

44 Relaciones en Pig Relaciones en Pig: Como tablas relacionales
En este caso las tuplas pueden ser incompletas Las relaciones están desordenadas por defecto Esquema en Pig: Nombres para campos, etc. … AS (cust, item, time, price); cust item time price customer412 1L_Leche T08:47:57Z $900 Nescafe $2.000 customer413 400g_Zanahoria T08:48:03Z $1.240

45 Campos en Pig Campos en Pig: Se referencian por nombre … o posición
premium = FILTER raw BY org.udf.MinPrice1000(price); … o posición premium = FILTER raw BY org.udf.MinPrice1000($3); ¡Más legible! Empieza con cero cust item time price customer412 1L_Leche T08:47:57Z $900 Nescafe $2.000 customer413 400g_Zanahoria T08:48:03Z $1.240

46 Apache Pig: Tipos

47 Tipos simples en Pig Tipos en Pig:
LOAD ‘transact.txt' USING PigStorage('\t') AS (cust:charArray, item:charArray, time:datetime, price:int); int, long, float, double, biginteger, bigdecimal, boolean, chararray (string), bytearray (blob), datetime

48 Tipos en Pig: "Duck Typing" (tipos flexibles)
¿Qué pasa si se omiten los tipos? Por defecto los campos son bytearray Conversiones implícitas contextuales (~"duck typing") A = LOAD 'data' AS (cust, item, hour, price); B = FOREACH A GENERATE hour + 4 % 24; C = FOREACH A GENERATE hour + 4f % 24; hour un integer hour un float

49 Tipos complejos en Pig tuple: Una fila en una tabla / una lista de campos ej., (customer412, Nescafe, 08, $2.000) bag (saco): Un multiconjunto de tuplas (permite duplicados) ej., { (cust412, 08, $2.000), (cust413, 08, $8.250) } map: Un conjunto de pares llave–valor ej., [Nescafe#$2.000]

50 Tipos complejos en Pig: Tuplas
cat data; (3,8,9) (4,5,6) (1,4,7) (3,7,5) (2,5,8) (9,5,8) A = LOAD 'data' AS (t1:tuple(t1a:int,t1b:int,t1c:int),t2:tuple(t2a:int,t2b:int,t2c:int)); DUMP A; ((3,8,9),(4,5,6)) ((1,4,7),(3,7,5)) ((2,5,8),(9,5,8)) X = FOREACH A GENERATE t1.t1a,t2.$0; t1 t2 t1a t1b t1c t2a t2b t2c 3 8 9 4 5 6 1 7 2 A:

51 Tipos complejos en Pig: Tuplas
cat data; (3,8,9) (4,5,6) (1,4,7) (3,7,5) (2,5,8) (9,5,8) A = LOAD 'data' AS (t1:tuple(t1a:int,t1b:int,t1c:int),t2:tuple(t2a:int,t2b:int,t2c:int)); DUMP A; ((3,8,9),(4,5,6)) ((1,4,7),(3,7,5)) ((2,5,8),(9,5,8)) X = FOREACH A GENERATE t1.t1a,t2.$0; DUMP X; (3,4) (1,3) (2,9) $0 $1 3 4 1 2 9 X:

52 Tipos complejos en Pig: Sacos
cat data; (3,8,9) (2,3,6) (1,4,7) (2,5,8) A = LOAD 'data' AS (c1:int, c2:int, c3:int); B = GROUP A BY c1; c1 c2 c3 3 8 9 2 6 1 4 7 5 A:

53 Tipos complejos en Pig: Sacos
cat data; (3,8,9) (2,3,6) (1,4,7) (2,5,8) A = LOAD 'data' AS (c1:int, c2:int, c3:int); B = GROUP A BY c1; DUMP B; (1,{(1,4,7)}) (2,{(2,5,8),(2,3,6)}) (3,{(3,8,9)}) group (c1) A c1 c2 c3 3 8 9 2 6 5 1 4 7 B:

54 Tipos complejos en Pig: Mapas
cat prices; [Nescafe#”$2.000”] [Gillette_Mach3#”$8.250”] A = LOAD ‘prices’ AS (M:map []);

55 Apache Pig: Desanidar ("flatten")

56 Pig Latin: Conteo de palabras
input_lines = LOAD '/tmp/book.txt' AS (line:chararray); -- extraer palabras de cada línea y ponerlas en un "saco" de Pig, -- después desanidar el saco para crear una palabra por línea words = FOREACH input_lines GENERATE FLATTEN(TOKENIZE(line)) AS word; -- filtrar las palabras que tengan sólo espacio en blanco filtered_words = FILTER words BY word MATCHES '\\w+'; -- agrupar por palabra word_groups = GROUP filtered_words BY word; -- contar los valores en cada grupo word_count = FOREACH word_groups GENERATE COUNT(filtered_words) AS count, group AS word; -- ordenar las palabras por conteo ordered_word_count = ORDER word_count BY count DESC; STORE ordered_word_count INTO '/tmp/book-word-count.txt';

57 Pig: Desanidar tuplas A: t1 t2 t1a t1b t1c t2a t2b t2c 3 8 9 4 5 6 1 7
cat data; (3,8,9) (4,5,6) (1,4,7) (3,7,5) (2,5,8) (9,5,8) A = LOAD 'data' AS (t1:tuple(t1a:int,t1b:int,t1c:int),t2:tuple(t2a:int,t2b:int,t2c:int)); DUMP A; ((3,8,9),(4,5,6)) ((1,4,7),(3,7,5)) ((2,5,8),(9,5,8)) X = FOREACH A GENERATE flatten(t1), flatten(t2); t1 t2 t1a t1b t1c t2a t2b t2c 3 8 9 4 5 6 1 7 2 A:

58 Pig: Desanidar tuplas X: t1a t1b t1c t2a t2b t2c 3 8 9 4 5 6 1 7 2
cat data; (3,8,9) (4,5,6) (1,4,7) (3,7,5) (2,5,8) (9,5,8) A = LOAD 'data' AS (t1:tuple(t1a:int,t1b:int,t1c:int),t2:tuple(t2a:int,t2b:int,t2c:int)); DUMP A; ((3,8,9),(4,5,6)) ((1,4,7),(3,7,5)) ((2,5,8),(9,5,8)) X = FOREACH A GENERATE flatten(t1), flatten(t2); DUMP X; (3,8,9,4,5,6) (1,4,7,3,7,5) (2,5,8,9,5,8) t1a t1b t1c t2a t2b t2c 3 8 9 4 5 6 1 7 2 X:

59 Pig: Desanidar tuplas A: t1 t2 t1a t1b t1c t2a t2b t2c 3 8 9 4 5 6 1 7
cat data; (3,8,9) (4,5,6) (1,4,7) (3,7,5) (2,5,8) (9,5,8) A = LOAD 'data' AS (t1:tuple(t1a:int,t1b:int,t1c:int),t2:tuple(t2a:int,t2b:int,t2c:int)); DUMP A; ((3,8,9),(4,5,6)) ((1,4,7),(3,7,5)) ((2,5,8),(9,5,8)) Y = FOREACH A GENERATE t1, flatten(t2); t1 t2 t1a t1b t1c t2a t2b t2c 3 8 9 4 5 6 1 7 2 A:

60 Pig: Desanidar tuplas Y: t1 t2a t2b t2c t1a t1b t1c 3 8 9 4 5 6 1 7 2
cat data; (3,8,9) (4,5,6) (1,4,7) (3,7,5) (2,5,8) (9,5,8) A = LOAD 'data' AS (t1:tuple(t1a:int,t1b:int,t1c:int),t2:tuple(t2a:int,t2b:int,t2c:int)); DUMP A; ((3,8,9),(4,5,6)) ((1,4,7),(3,7,5)) ((2,5,8),(9,5,8)) Y = FOREACH A GENERATE t1, flatten(t2); DUMP Y; ((3,8,9),4,5,6) ((1,4,7),3,7,5) ((2,5,8),9,5,8) t1 t2a t2b t2c t1a t1b t1c 3 8 9 4 5 6 1 7 2 Y:

61 Pig: Desanidar sacos B: group (c1) A c1 c2 c3 3 8 9 2 6 5 1 4 7
cat data; (3,8,9) (2,3,6) (1,4,7) (2,5,8) A = LOAD 'data' AS (c1:int, c2:int, c3:int); B = GROUP A BY c1; DUMP B; (1,{(1,4,7)}) (2,{(2,5,8),(2,3,6)}) (3,{(3,8,9)}) C = FOREACH B GENERATE flatten(A); group (c1) A c1 c2 c3 3 8 9 2 6 5 1 4 7 B:

62 Pig: Desanidar sacos C: c1 c2 c3 3 8 9 2 6 5 1 4 7 cat data; (3,8,9)
(2,3,6) (1,4,7) (2,5,8) A = LOAD 'data' AS (c1:int, c2:int, c3:int); B = GROUP A BY c1; DUMP B; (1,{(1,4,7)}) (2,{(2,5,8),(2,3,6)}) (3,{(3,8,9)}) C = FOREACH B GENERATE flatten(A); DUMP C; c1 c2 c3 3 8 9 2 6 5 1 4 7 C:

63 Pig: Desanidar sacos B: group (c1) A c1 c2 c3 3 8 9 2 6 5 1 4 7
cat data; (3,8,9) (2,3,6) (1,4,7) (2,5,8) A = LOAD 'data' AS (c1:int, c2:int, c3:int); B = GROUP A BY c1; DUMP B; (1,{(1,4,7)}) (2,{(2,5,8),(2,3,6)}) (3,{(3,8,9)}) D = FOREACH B GENERATE group, flatten(A); group (c1) A c1 c2 c3 3 8 9 2 6 5 1 4 7 B:

64 Pig: Desanidar sacos D: group c1 c2 c3 3 8 9 2 6 5 1 4 7 cat data;
(3,8,9) (2,3,6) (1,4,7) (2,5,8) A = LOAD 'data' AS (c1:int, c2:int, c3:int); B = GROUP A BY c1; DUMP B; (1,{(1,4,7)}) (2,{(2,5,8),(2,3,6)}) (3,{(3,8,9)}) D = FOREACH B GENERATE group, flatten(A); DUMP D; (3,3,8,9) (2,2,3,6) (2,2,5,8) (1,1,4,7) group c1 c2 c3 3 8 9 2 6 5 1 4 7 D:

65 Apache Pig: Operadores

66 Operadores atómicos en Pig
Comparación ==, !=, >, <, >=, <=, matches (regex) Aritmética + , −, *, / Referencia tuple.field, map#value Booleanos AND, OR, NOT Conversión ("Casting")

67 Condicionales en Pig Operador ternario: Casos:
hr12 = FOREACH item GENERATE hour%12, (hour>12 ? ’pm’ : ’am’); Casos: X = FOREACH A GENERATE hour%12, ( CASE WHEN hour>12 THEN ‘pm’ ELSE ‘am’ END );

68 Agregración en Pig Agrupamiento: Operadores de agregación:
Se puede usar GROUP con múltiples relaciones o COGROUP con una única (pero COGROUP se considera más legible para múltiples relaciones) Agregración en Pig Agrupamiento: GROUP: agrupamiento con una sola relación GROUP premium BY (item, hour); COGROUP: agrupamiento con múltiples relaciones COGROUP premium BY (item, hour), cheap BY (item, hour); Operadores de agregación: AVG, MIN, MAX, SUM, COUNT, SIZE, CONCAT

69 Joins en Pig X: cat data1; (Nescafe,08,120) (El_Mercurio,08,142)
(8250, Gillette_Mach3) (500, El_Mercurio) A = LOAD 'data1' AS (prod:charArray, hour:int, count:int); B = LOAD 'data2' AS (price:int, name:charArray); X = JOIN A BY prod, B BY name; DUMP X: (El_Mercurio,08,142, 500, El_Mercurio) (Nescafe,08,120, 2000, Nescafe) (Nescafe,09,153, 2000, Nescafe) prod hour count price name Nescafe 08 120 2000 09 153 El_Mercurio 142 500 X:

70 Joins en Pig Inner join: El ejemplo anterior (el join por defecto)
Self join: Genera un alias y hace join con él Outer joins: LEFT / RIGHT / FULL Producto cruz: CROSS ¿Saben (o recuerdan) la diferencia entre un INNER JOIN, OUTER JOIN / LEFT / RIGHT / FULL y un CROSS PRODUCT?

71 Implementación de agregación / join en Pig
Partición configurable / número de reductores: PARTITION BY especifica un UDF para particionar PARALLEL especifica el número de reductores X = JOIN A BY prod, B BY name PARTITION BY org.udp.Partitioner PARALLEL 5; X = GROUP A BY hour PARTITION BY org.udp.Partitioner PARALLEL 5;

72 Pig: Desambiguación ¿Pero cuál prodName? cat data1; (Nescafe,08,120)
(El_Mercurio,08,142) (Nescafe,09,153) cat data2; (2000,Nescafe) (8250,Gillette_Mach3) (500,El_Mercurio) A = LOAD 'data1' AS (prodName:charArray, hour:int, count:int); B = LOAD 'data2' AS (price:int, prodName:charArray); X = JOIN A BY prodName, B BY prodName; DUMP X: (El_Mercurio,08,142,500,El_Mercurio) (Nescafe,08,120, 2000,Nescafe) (Nescafe,09,153, 2000,Nescafe) Y = FOREACH X GENERATE prodName Y = FOREACH X GENERATE A::prodName ¿Pero cuál prodName?

73 Pig: Reparto ("Split") numeric: cheap: premium:
raw = LOAD ‘transact.txt' USING PigStorage('\t') AS (cust, item, time, price); numeric = FOREACH raw GENERATE cust item time org.udf.NoSign(price) AS price; SPLIT numeric INTO cheap IF price<1000, premium IF price>=1000; numeric: cust item time price customer412 1L_Leche T08:47:57Z 900 Nescafe 2.000 customer413 400g_Zanahoria T08:48:03Z 1.240 cheap: premium: cust item time price customer412 1L_Leche T08:47:57Z 900 cust item time price customer412 Nescafe T08:47:57Z 2.000 customer413 400g_Zanahoria T08:48:03Z 1.240

74 Pig: Otros operadores FILTER: Filtrar tuplas por una expresión
LIMIT: Retornar sólo cierto número de tuplas MAPREDUCE: Ejecutar un .jar nativo de Hadoop ORDER BY: Ordenar tuplas SAMPLE: Obtener muestra de tuplas UNION: Concatenar dos relaciones

75 Apache Pig: Ejecucción

76 Traducido a MapReduce en Hadoop
Pig es sólo una interfaz / un lenguaje de scripting para MapReduce

77 Ejecutar Pig: (i) Grunt
grunt> in_lines = LOAD '/tmp/book.txt' AS (line:chararray); grunt> words = FOREACH in_lines GENERATE FLATTEN(TOKENIZE(line)) AS word; grunt> filtered_words = FILTER words BY word MATCHES '\\w+'; grunt> … … grunt> STORE ordered_word_count INTO '/tmp/book-word-count.txt';

78 Ejecutar Pig: (ii) Script
grunt> pig wordcount.pig wordcount.pig

79 Ejecutar Pig: (iii) Desde código

80 Si quieren leer más

81 Una mención …

82 Apache Hive HiveQL: Lenguaje al estilo SQL que se compila en tareas de MapReduce en Hadoop Parecido a Apache Pig pero … Pig es más procedural y Hive es más declarativo

83 ¿Preguntas?


Descargar ppt "Gestión de Datos (Masivos) Diplomado de Datos 2017 Clase 3: Pig"

Presentaciones similares


Anuncios Google