Magamról

Saját fotó
Főiskolai, majd egyetemi diplomamunkáimtól kezdve világ életemben, adatok, adatbázisok, adattárházak (leginkább Oracle) környékén mozogtam. Mostanság adattárházasként, adatbányászként élem napjaimat.

2013. május 20., hétfő

Data Science MapReduce-feladatok


Ígérem nem lesz rendszer a napi két blogposzt. :)

És hogy necsak, a vakvilágba, l'art pour l'art beszéljünk a Data Science-be bimbózó, sőt szárbaszőkő vidámságokról, a Python és Sql után könnyen adódik a MapReduce szépségeiben való elmerülés.

Arra nem vállalkoznék, hogy számszerűsítsem a 2004-es Google ernyője alól kikerült algoritmus jelentőségét, de hogy a világ egyik legjobb mókája vele dolgozni az biztos (és bizton mondhatom evvel nem vagyok egyedül). Hozzá talán egyedül az SQL-t tudnám hasonlítani, az bír ennyire élvezetes lenni még talán (leszámítva és ide nem értve az SQL-nyelvjárások nyűgjeinek kerülgetését).

Magyar anyag nincs oly sok fenn a neten, ez az alábbi frissebb és nagyon szimpatikus (25 diás prezentáció)
CAP, mapreduce, Hadoop

A feladatok Bill Howe(University Washington) feladataiból egy válogatás, ahogy egyébként a múltkori Pythonos és SQL feladatok is tőle származtak eredendően.

1.feladat: http://jsmapreduce.com/

Ez egy kiváló eszköz, hogy  nulla overheaddel, maximális élvezettel gyakoroljuk a MapReduce-t. Fizetni sem kell az Amazonas-nak egy centet sem, az csak egy további opció, ha addiktívvá váltunk az eszköz hatására. :)

Először is - minő meglepetés - telepíteni kell hozzá vagy egy Mozilla Firefox, vagy egy Google Chrome böngészőt, merthogy Internet Explorer alatt nem megy. Én nem fogadnék rá nagy pénzben, hogy valaha is elérhető lesz IE alatt is, azaz erre nem érdemes várni... :)

Másodszor kell regisztrálni, ha valaki például a Pythonos menüpontokat a maguk teljességében akarja élvezni. Első gondolkodtató kérdés: vajon a honlap miért sújtja regisztrációs átokkal a Python-t? ;)

Harmadszor, használati utasítás gyanánt, meg lehet nézni - egy szerintem borzalmas minőségű - közel 15 perces - természetesen angol nyelvű - videót a vonatkozó cucchoz. Én ezt ugrottam pár perc után, annyira elviselhetetlennek találtam, különben is eléggé intuitív az egész eszköz, nem kell hozzá semmilyen videó, szvsz.
Introduction to JSMapreduce

És akkor a feladat:
Módosítsuk a pókeranalízist (Sample 2 vagy Sample 4), hogy például a valóságban nemlétező négyes sorokat (4cardstraights) is kalkulálja. Azaz a figurákból (A,2,3,4,5,6,7,8,9,T,J,Q,K,A) tetszőleges négy egymás mellett legyen, bármilyen szín(treff,káró,kőr,pikk) eloszlással. Erősséget tekintve a 4-es sor nyilván gyengébb az 5-ös sornál, és persze kerülni kell, hogy a teljes sor "straight" beleszámolódjon bármelyik 4-es sorba.

Bónusz-kérdések:
- Melyik verziónak érdemes nekiesni? Javascript-esnek, vagy Python-osnak?
- Megfordítva: miért sokkal lassabb a Pythonos? Ennyivel lassabb kód futna esetében?

2.feladat: Klasszikus HelloWorld-jellegű szószámlálás  MapReduce-ban (teljes megoldással):

Feladat: számoljuk meg Python programmal, mely szavak hányszor szerepelnek a szövegekben!

Íme book.json file részlete, doc_id-text párokkal.
["milton-paradise.txt", "Book I Of Man ' s first disobedience"]
["edgeworth-parents.txt", "Near the ruins of the castle of Rossmore"]
["austen-emma.txt", "Emma Woodhouse , handsome , clever , and rich"]
["chesterton-ball.txt", "The flying ship of Professor Lucifer sang through the skies like"]
["bible-kjv.txt", "The Old Testament of the King James Bible The First Book of Moses"]
["shakespeare-caesar.txt", "Enter Flauius , Murellus , and certaine Commoners ouer the Stage"]
["melville-moby_dick.txt", "The pale Usher -- threadbare in coat , heart , body , and brain"]

Fog kelleni egy - feladatosztályt érintően nem változó - MapReduce.py, osztály-definicióval, ha szimulálni akarjuk a MapReduce működését egyszerű eszközökkel (megírandó programjaink mellé).
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
import json

class MapReduce:
    def __init__(self):
        self.intermediate = {}
        self.result = []

    def emit_intermediate(self, key, value):
        self.intermediate.setdefault(key, [])
        self.intermediate[key].append(value)

    def emit(self, value):
        self.result.append(value)

    def execute(self, data, mapper, reducer):
        for line in data:
            record = json.loads(line)
            mapper(record)

        for key in self.intermediate:
            reducer(key, self.intermediate[key])

        #jenc = json.JSONEncoder(encoding='latin-1')
        jenc = json.JSONEncoder()
        for item in self.result:
            print(jenc.encode(item))
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Illetve kell egy wordcount.py, ami a feladatot megoldja:
Futtatás: python wordcount.py books.json
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
import MapReduce
import sys

mr = MapReduce.MapReduce()

def mapper(record):
    key = record[0]
    value = record[1]
    words = value.split()
    for w in words:
      mr.emit_intermediate(w, 1)

def reducer(key, list_of_values):
    total = 0
    for v in list_of_values:
      total += v

    mr.emit((key, total))

if __name__ == '__main__':
  inputdata = open(sys.argv[1])
  mr.execute(inputdata, mapper, reducer)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

3.feladat: Adott továbbra is a book.json bemeneti file.
Módosítsuk az előbbi szószámláló progit (inverted_index.py), úgy, hogy minden szó mellé listában irassuk ki mely (doc_id-val azonosított) szövegekben fordul elő az adott szó.
Kimeneti minta:
["all", ["milton-paradise.txt", "blake-poems.txt", "melville-moby_dick.txt"]]

4. feladat: Adott egy records.json bemeneti file, alábbi mintával.
Ez tartalmazza a rendeléseket, és a rendelések tételeit.
A második oszlop (mindkét rekordtípusnál) az order_id, utána még teszőlegesen sok attribútum lehet.
Írjuk át MapReduce-ra az alábbi SQL-lekérdezés: join.py
SELECT *
FROM Orders, LineItem
WHERE Orders.order_id = LineItem.order_id
["Orders", "1", "36901"...]
["LineItem", "1", "155190"...]

5.feladat: Adott egy friends.json bemeneti file, alábbi mintával.
Mindenki nyilatkozott kit tekint barátjának. Ebből következik, hogy a barátság nem kommutatív. Ha "A" barátjának érzi "B"-t, abból nem következik, hogy "B" barátja "A"-nak. Listázzuk ki MapReduce-szal az asszimmetrikus barátságokat: asymmetric_friendships.py
["Myriel", "Geborand"]
["Myriel", "Champtercier"]

6.feladat: Adott egy dna.json, génszekvencia-id illetve génszekvencia-string párokkal.
MapReduce segítségével töröljük minden génszekvenciából az utolsó 10 karaktert, majd deduplikáljuk az összes génszekvenciát (minden csonka génszekvenciából egy maradjon a kimenetre): unique_trims.py

7.feladat Adott egy matrix.json bemeneti-file, alábbi mintával.
Két ritka mátrix (a,b) valós, nem-nulla elemeit tartalmazza (sor,oszlop,érték)
MapReduce segítségével számoljuk ki a szorzat mátrixot: multiply.py
["a", 0, 0, 63]
["b", 0, 0, 61]

Nincsenek megjegyzések:

Megjegyzés küldése