Les Pandas dataframe de susciter dataframe “ne Peut pas fusionner erreur de type”
J'ai données au format csv, et créé des Pandas dataframe à l'aide de read_csv et en forçant toutes les colonnes comme une chaîne de caractères.
Puis, quand j'essaie de créer l'Étincelle dataframe de l'Pandas dataframe, j'obtiens le message d'erreur ci-dessous.
from pyspark import SparkContext
from pyspark.sql import SQLContext
from pyspark.sql.types import *
z=pd.read_csv("mydata.csv", dtype=str)
z.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 74044003 entries, 0 to 74044002
Data columns (total 12 columns):
primaryid object
event_dt object
age object
age_cod object
age_grp object
sex object
occr_country object
drug_seq object
drugname object
route object
outc_cod object
pt object
q= sqlContext.createDataFrame(z)
File "<stdin>", line 1, in <module>
File "/usr/hdp/2.4.2.0-258/spark/python/pyspark/sql/context.py", line 425, in createDataFrame
rdd, schema = self._createFromLocal(data, schema)
File "/usr/hdp/2.4.2.0-258/spark/python/pyspark/sql/context.py", line 341, in _createFromLocal
struct = self._inferSchemaFromList(data)
File "/usr/hdp/2.4.2.0-258/spark/python/pyspark/sql/context.py", line 241, in _inferSchemaFromList
schema = reduce(_merge_type, map(_infer_schema, data))
File "/usr/hdp/2.4.2.0-258/spark/python/pyspark/sql/types.py", line 862, in _merge_type
for f in a.fields]
File "/usr/hdp/2.4.2.0-258/spark/python/pyspark/sql/types.py", line 856, in _merge_type
raise TypeError("Can not merge type %s and %s" % (type(a), type(b)))
TypeError: Can not merge type <class 'pyspark.sql.types.DoubleType'> and <class 'pyspark.sql.types.StringType'>
Ici est un exemple. Je suis le téléchargement de données publiques et la création de pandas dataframe mais l'étincelle ne crée pas d'étincelle dataframe de l'pandas dataframe.
import pandas as pd
from pyspark import SparkContext
from pyspark.sql import SQLContext
from pyspark.sql.types import *
url ="http://www.nber.org/fda/faers/2016/demo2016q1.csv.zip"
import requests, zipfile, StringIO
r = requests.get(url, stream=True)
z = zipfile.ZipFile(StringIO.StringIO(r.content))
z.extractall()
z=pd.read_csv("demo2016q1.csv") # creates pandas dataframe
Data_Frame = sqlContext.createDataFrame(z)
- a) pourquoi avez-vous de lire les données en local juste à paralléliser. C'est l'anti-modèle. b) toutes les colonnes soient marqués comme
object
suggérer quelques données hétérogènes qui n'est pas pris en charge par Spark DataFrames. - Vous avez raison, ce n'est pas la bonne façon de lire localement, mais depuis d'autres options ont échoué, j'ai espéré un dataframe de pandas sera facile pour étincelle à la poignée. Comme vous l'avez dit, les colonnes sont hétérogènes. Est-il une solution que je puisse essayer?
- Pouvez-vous fournir une un minimum de reproductibles exemple? Certains jouets échantillon qui illustrent ce qui se passe là-bas...
- J'ai ajouté un exemple de code avec les données publiques.
Vous devez vous connecter pour publier un commentaire.
Longue histoire courte ne dépendent pas de schéma d'inférence. Il est coûteux et difficile en général. En particulier, certaines colonnes (par exemple
event_dt_num
) dans vos données ont des valeurs manquantes qui pousse les Pandas à les représenter comme un mélange de types (chaîne pour ne pas manquer, NaN pour les valeurs manquantes).Si vous êtes dans le doute il est préférable de lire toutes les données sous forme de chaînes et jeté par la suite. Si vous avez accès au code livre, vous devez toujours fournir le schéma pour éviter les problèmes et de réduire le coût global.
Enfin le passage des données à partir du pilote est anti-modèle. Vous devez être capable de lire directement ces données à l'aide de
csv
format (Étincelle 2.0.0+) ouspark-csv
bibliothèque (Étincelle 1.6 et ci-dessous):Dans ce cas particulier, l'ajout de
inferSchema="true"
option devrait fonctionner aussi bien, mais il est encore mieux de l'éviter. Vous pouvez également fournir le schéma comme suit:directement au lecteur: