[PYTHON] Postleitzahlinformationen mit Funken extrahieren

** Schnell mit Funken ** Ich habe es in meinem Ohr gefangen und versucht, es einmal zu bewegen.

Grundeinstellung

Ich habe es mit Homebrew wie folgt eingeführt.

brew install apache-spark

Datenerfassung

Ich habe Postleitzahldaten im CSV-Format von der folgenden Website erhalten. zipcloud

Startmethode

Verschieben Sie es in den folgenden Apache-Spark-Ordner, da es mit Homebrew installiert wurde.

cd /usr/local/Cellar/apache-spark/1.5.2/bin/

Anscheinend unterstützt Spark Scala, Java, Python, R, aber ich wollte Python verwenden

pyspark

Beginnen mit. Wenn Sie die Markierung "Funken" sehen, ist dies in Ordnung.

Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 1.5.2
      /_/

Using Python version 2.7.11 (default, Dec 26 2015 17:47:53)
SparkContext available as sc, HiveContext available as sqlContext.
>>>

Implementierungsdetails

Bundesweit gibt es rund 120.000 Postleitzahldaten. Vor der Implementierung habe ich die Daten 88 Mal kopiert, unter der Annahme, dass eine große Datenmenge verarbeitet wird, und sie auf etwa 12 Millionen verdoppelt, um eine neue CSV-Datei zu erstellen. Und

sparkSample.py


# -*- coding: utf-8 -*-
import time
from pyspark import SparkContext

def main():
    #Kanji, das Sie suchen möchten
    queryList = ["Hirsch","Vogel","Bär","Affe","Hund"]
    
    #Start der Zeitmessung
    start = time.time()
    
    #Datensatz
    sc = SparkContext('local', 'Simple App')
    logData = sc.textFile('KEN_ALL_OVER_TEN_MILLION.CSV')
    
    #Extrahieren Sie Informationen für jede Abfrage
    for item in queryList:
        #Liste mit Split
        lines = logData.map(lambda x: x.split(','))
        #Extrahieren Sie diejenigen, deren Postleitzahl 7 enthält.
        numberPicks = lines.filter(lambda s: unicode('7', 'utf-8') in s[2])
        #Extrahieren Sie die Namen von Städten und Dörfern, die das Ziel-Kanji enthalten
        namePicks = lines.filter(lambda s: unicode(item, 'utf-8') in s[7])
        #In Liste speichern
        desList = namePicks.collect()

        #Protokollausgabe
        for line in desList:
            s = u""
            for i, unit in enumerate(line):
                if i != 0:
                    s = s + u', '
                s = s + unit
            print s.encode('utf-8')

        #Hit Count-Ausgabe
        outlog = "query:" + item.decode('utf-8') + u", count:" + \
            unicode(str(len(desList)), 'utf-8') + ", Time:{0}".format(time.time() - start) + u"[sec]"
        print outlog.encode('utf-8')    
    
    #Stopp der Zeitmessung
    finish_time = time.time() - start
    print u"Time[total]:{0}".format(finish_time) + u"[sec]"

    #Verarbeitung beenden
    sc.stop()

if __name__ == '__main__':
    main()

Bei der Auswertung habe ich auch den Code geschrieben, wenn kein Funke verwendet wird.

plain.py


# -*- coding: utf-8 -*-
import time

def pickAnimal(recordList, qList, start):
    #Extrahieren Sie Informationen für jede Abfrage
	for q in qList:
		count = 0
		for record in recordList:
			sepRecord = record.split(",")
			if len(sepRecord) == 15:
                #Extrahieren Sie diejenigen, deren Postleitzahl 7 enthält.
                #Extrahieren Sie die Namen von Städten und Dörfern, die das Ziel-Kanji enthalten
				if -1 < sepRecord[2].find("7") and -1 < sepRecord[7].find(q):
					count = count + 1
                    #Protokollausgabe
					print record
                    #Hit Count-Ausgabe
		print "query:" + q + ", count:" + str(count) + ", Time:{0}".format(time.time() - start) + "[sec]"

def main():

	sepRecordList = []
    #Kanji, das Sie suchen möchten
	queryList = ["Hirsch","Vogel","Bär","Affe","Hund"]

    #Datensatz
	srcpath = "KEN_ALL_OVER_TEN_MILLION.CSV"
	srcIN = open(srcpath, 'r')

    #Start der Zeitmessung
	start = time.time()
	for line in srcIN:
		sepRecordList.append(line)

	pickAnimal(sepRecordList, queryList, start)

    #Stopp der Zeitmessung
	finish_time = time.time() - start
	print "Time:{0}".format(finish_time) + "[sec]"

    #Verarbeitung beenden
	srcIN.close()

if __name__ == '__main__':
    main()

Messergebnis

$pyspark sparkSample.py
~(Unterlassung)~
Time[total]:645.52906394[sec]
$python plain.py
~(Unterlassung)~
Time:112.966698885[sec]

Hmm, die normale Implementierung ist ungefähr sechsmal schneller. .. ..

Anmerkung der Redaktion

Um die Geschwindigkeit zu realisieren, scheint es notwendig zu sein, eine Umgebung für die verteilte Verarbeitung vorzubereiten oder Versuche einer großen Datenmenge durch maschinelles Lernen zu wiederholen. Ich hatte das Gefühl, dass mein nächstes Ziel darin bestand, die Kraft des Funkens auf meiner Haut zu erfahren.

Referenz

Recommended Posts

Postleitzahlinformationen mit Funken extrahieren
Extrahieren Sie Informationen mit File :: Stat in Ruby
Geokodierung der Postleitzahl
Beispielcode-Sammlung für Spark-Datenrahmen
Berechnen Sie den Informationsgewinn mit NLTK