[PYTHON] Extraire les informations du code postal à l'aide de Spark

** Rapide avec étincelle ** Je l'ai attrapé dans mon oreille, alors j'ai essayé de le déplacer une fois.

Réglage initial

Je l'ai présenté en utilisant Homebrew comme suit.

brew install apache-spark

L'acquisition des données

J'ai obtenu des données de code postal au format CSV sur le site suivant. zipcloud

méthode de départ

Puisqu'il a été installé avec Homebrew, déplacez-le dans le dossier apache-spark suivant.

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

Apparemment, spark prend en charge scala, java, python, R, mais je voulais utiliser python

pyspark

Commencer avec. Si vous voyez la marque «étincelle», c'est OK.

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.
>>>

Détails d'implémentation

Il existe environ 120 000 codes postaux à l'échelle nationale. Avant de l'implémenter, j'ai copié les données 88 fois en supposant qu'une grande quantité de données serait traitée, et je l'ai doublée à environ 12 millions pour créer un nouveau fichier CSV. Et

sparkSample.py


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

def main():
    #Kanji que vous souhaitez rechercher
    queryList = ["cerf","oiseau","ours","singe","chien"]
    
    #Début de la mesure du temps
    start = time.time()
    
    #base de données
    sc = SparkContext('local', 'Simple App')
    logData = sc.textFile('KEN_ALL_OVER_TEN_MILLION.CSV')
    
    #Extraire des informations pour chaque requête
    for item in queryList:
        #Liste avec division
        lines = logData.map(lambda x: x.split(','))
        #Extraire ceux dont le code postal contient 7.
        numberPicks = lines.filter(lambda s: unicode('7', 'utf-8') in s[2])
        #Extrayez les noms des villes, villages et villages qui incluent le kanji cible
        namePicks = lines.filter(lambda s: unicode(item, 'utf-8') in s[7])
        #Stocker dans la liste
        desList = namePicks.collect()

        #Sortie de journal
        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')

        #Sortie du nombre de coups
        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')    
    
    #Arrêt de la mesure du temps
    finish_time = time.time() - start
    print u"Time[total]:{0}".format(finish_time) + u"[sec]"

    #Terminer le traitement
    sc.stop()

if __name__ == '__main__':
    main()

Lors de l'évaluation, j'ai également écrit le code lorsque Spark n'est pas utilisé.

plain.py


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

def pickAnimal(recordList, qList, start):
    #Extraire des informations pour chaque requête
	for q in qList:
		count = 0
		for record in recordList:
			sepRecord = record.split(",")
			if len(sepRecord) == 15:
                #Extraire ceux dont le code postal contient 7.
                #Extrayez les noms des villes, villages et villages qui incluent le kanji cible
				if -1 < sepRecord[2].find("7") and -1 < sepRecord[7].find(q):
					count = count + 1
                    #Sortie de journal
					print record
                    #Sortie du nombre de coups
		print "query:" + q + ", count:" + str(count) + ", Time:{0}".format(time.time() - start) + "[sec]"

def main():

	sepRecordList = []
    #Kanji que vous souhaitez rechercher
	queryList = ["cerf","oiseau","ours","singe","chien"]

    #base de données
	srcpath = "KEN_ALL_OVER_TEN_MILLION.CSV"
	srcIN = open(srcpath, 'r')

    #Début de la mesure du temps
	start = time.time()
	for line in srcIN:
		sepRecordList.append(line)

	pickAnimal(sepRecordList, queryList, start)

    #Arrêt de la mesure du temps
	finish_time = time.time() - start
	print "Time:{0}".format(finish_time) + "[sec]"

    #Terminer le traitement
	srcIN.close()

if __name__ == '__main__':
    main()

Résultat de la mesure

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

Hmm, c'est environ 6 fois plus rapide à mettre en œuvre normalement. .. ..

Note de l'éditeur

Afin de réaliser la vitesse, il semble qu'il soit nécessaire de préparer un environnement pour le traitement distribué ou de répéter les essais d'une grande quantité de données par apprentissage automatique. J'ai senti que mon prochain objectif était d'expérimenter le pouvoir de l'étincelle sur ma peau.

référence

--SparkContext mémo (http://www.ne.jp/asahi/hishidama/home/tech/scala/spark/SparkContext.html)

Recommended Posts

Extraire les informations du code postal à l'aide de Spark
Extraire des informations à l'aide de File :: Stat dans Ruby
Géocodage du code postal
Exemple de collecte de code Spark Dataframe
Calculer le gain d'informations à l'aide de NLTK