[PYTHON] Remarque sur la connexion de Spark à IBM Object Storage basé sur OpenStack Swift

Bien qu'il existe diverses sources de données, il semble que l'obstacle soit faible pour mettre le fichier tel quel dans le stockage à la hâte. S'il s'agit d'une prémisse de Big Data comme Spark, les fichiers journaux, etc. sont souvent supposés, mais comme les données commerciales générales ne peuvent pas être évitées, d'abord CSV, donc quand j'ai essayé un peu autour du CSV Remarque. (Chez IBM Data Scientist Experience, Python 2 avec Spark 2.0)

Préparation

Téléchargez le fichier CSV dans IBM Object Storage basé sur Swift. Utilisez «Déposez votre fichier ici ou parcourez vos fichiers pour ajouter un nouveau fichier» sur le côté droit de l'écran. J'ai téléchargé baseball.csv, cars.csv, whisky.csv comme indiqué sur la capture d'écran. Screen Shot 2016-11-23 at 21.22.24.png

J'ai essayé de lire des données depuis Object Storage

J'ai d'abord essayé avec le code inséré à partir du code DSX Screen Shot 2016-11-23 at 21.20.47.png

Il existe un processus pour définir la configuration et un processus pour charger les données CSV dans DataFrame. (1) Définir la configuration Hadoop à partir de Spark Les paramètres de configuration décrits dans Accès à OpenStack Swift à partir de Spark sont définis en fonction du fichier téléchargé sur IBM Object Storage. Il paraît que

test.py


# @hidden_cell
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)

# This function accesses a file in your Object Storage. The definition contains your credentials.
# You might want to remove those credentials before you share (name):
def set_hadoop_config_with_credentials_xxxxxxxxxxxxxxxxxxcxxxxxcc(name):
    """This function sets the Hadoop configuration so it is possible to
    access data from Bluemix Object Storage V3 using Spark"""

    prefix = 'fs.swift.service.' + name
    hconf = sc._jsc.hadoopConfiguration()
    hconf.set(prefix + '.auth.url', 'https://identity.open.softlayer.com'+'/v3/auth/tokens')
    hconf.set(prefix + '.auth.endpoint.prefix', 'endpoints')
    hconf.set(prefix + '.tenant', '4dbbbca3a8ec42eea9349120fb91dcf9')
    hconf.set(prefix + '.username', 'xxxxxxxxxcxxxxxxcccxxxxxccc')
    hconf.set(prefix + '.password', 'Xxxxxxxxxxxxxxxxx')
    hconf.setInt(prefix + '.http.port', 8080)
    hconf.set(prefix + '.region', 'dallas')
    hconf.setBoolean(prefix + '.public', True)

# you can choose any name
name = 'keystone'
set_hadoop_config_with_credentials_Xxxxxxxxxxxxxxxxxxcxxxxxc(name)

(2) Charger les données CSV dans la trame de données Spark

test.py


df_data_1=sqlContext.read.format('com.databricks.spark.csv')\
    .options(header='true',inferschema='true')\
    .load("swift://PredictiveAnalyticsProject2." + name + "/whiskey.csv")

Cela semble utiliser un package appelé spark-csv qui était nécessaire avant Spark 2.0. Depuis spark2.0, Spark DataFrame semble être capable de gérer directement csv, et read.csv () peut également être utilisé, ce qui est pratique. Screen Shot 2016-11-23 at 21.38.46.png

J'ai essayé d'écrire des données sur Object Storage

Le contenu du Spark DataFrame qui chargeait whisky.csv a été exporté vers Object Storage avec le nom whiskey_new.csv. (1) J'ai essayé de sortir avec l'écriture de Spark Data Frame Écrivez simplement write.csv () et c'est OK. Screen Shot 2016-11-23 at 21.50.24.png

En ce qui concerne le mode, il semble que le mode Save tel qu'illustré dans here puisse être utilisé. En regardant le fichier de sortie, il a été divisé en plusieurs fichiers et en sortie au lieu d'un CSV, comme indiqué dans la capture d'écran ci-dessous. Je pense que c'est parce qu'il est traité par plusieurs nœuds. (C'est étrange? Quand vous relisez ceci depuis Spark avec read.csv, il est traité comme un textFile, csv, donc il ne semble y avoir aucun problème). Screen Shot 2016-11-23 at 21.49.21.png Cependant, il semble qu'il y ait des personnes autres que moi qui veulent sortir dans un fichier, et il y avait aussi un Q & R demandant si cela pouvait être sorti dans un fichier (http://stackoverflow.com/questions/31674530/write-single-). csv-file-using-spark-csv)

(2) J'ai essayé l'API REST sans utiliser Spark Je ne pense pas qu'il soit adapté pour gérer une grande quantité de données, mais vous pouvez le mettre en tant que CSV sur Object Storage avec le code suivant. (La partie get du code que DSX insère pour créer Pandas DataFrame est juste modifiée pour put. Placez la destination / url2 pour le téléchargement à partir de la réponse tout en recevant les informations d'authentification par le premier appel d'API / POST Semble assembler)

put_sample.py


def put_object_storage_file_with_credentials_xxxxxxxxxx(container, filename, indata):
    url1 = ''.join(['https://identity.open.softlayer.com', '/v3/auth/tokens'])
    data = {'auth': {'identity': {'methods': ['password'],
            'password': {'user': {'name': 'member_1825cd3bc875420fc629ccfd22c22e20433a7ac9','domain': {'id': '07e33cca1abe47d293b86de49f1aa8bc'},
            'password': 'xxxxxxxxxx'}}}}}
    headers1 = {'Content-Type': 'application/json'}
    resp1 = requests.post(url=url1, data=json.dumps(data), headers=headers1)
    resp1_body = resp1.json()
    for e1 in resp1_body['token']['catalog']:
        if(e1['type']=='object-store'):
            for e2 in e1['endpoints']:
                        if(e2['interface']=='public'and e2['region']=='dallas'):
                            url2 = ''.join([e2['url'],'/', container, '/', filename])
    s_subject_token = resp1.headers['x-subject-token']
    headers2 = {'X-Auth-Token': s_subject_token, 'accept': 'application/json'}
    resp2 = requests.put(url=url2, headers=headers2 , data=indata)
    print resp2
    return (resp2.content)


put_object_storage_file_with_credentials_xxxxxxxxxx( 'PredictiveAnalyticsProject2', 'whiskey_new_s.csv' , df_data_2.to_csv( index = False ) )

Postscript

Il semble y avoir un moyen d'utiliser swiftclient de Python comme image à mettre avec l'API REST ci-dessus, mais cela ne semble pas fonctionner dans l'environnement d'IBM Data Scientist Experience. Using IBM Object Storage in Bluemix, with Python Screen Shot 2016-11-23 at 22.36.18.png

Recommended Posts

Remarque sur la connexion de Spark à IBM Object Storage basé sur OpenStack Swift
Convertir l'API cURL en script Python (à l'aide du stockage d'objets IBM Cloud)
Une note sur __call__
Une note sur le sous-processus
Une note sur mprotect (2)
Une note sur KornShell (ksh)
Une note sur TensorFlow Introduction
Une note sur [python] __debug__
Python: une note sur les classes 1 "Résumé"
Remarque à propos de get_scorer de sklearn
Une introduction légère à la détection d'objets
Une note sur mock (bibliothèque fictive Python)