J'ai un pandas data frame my_df
, et my_df.dtypes
nous donne:
ts int64
fieldA object
fieldB object
fieldC object
fieldD object
fieldE object
dtype: object
Ensuite, j'essaie de convertir le pandas data frame my_df
à un spark en faisant ci-dessous:
spark_my_df = sc.createDataFrame(my_df)
Cependant, j'ai eu les erreurs suivantes:
ValueErrorTraceback (most recent call last)
<ipython-input-29-d4c9bb41bb1e> in <module>()
----> 1 spark_my_df = sc.createDataFrame(my_df)
2 spark_my_df.take(20)
/usr/local/spark-latest/python/pyspark/sql/session.py in createDataFrame(self, data, schema, samplingRatio)
520 rdd, schema = self._createFromRDD(data.map(prepare), schema, samplingRatio)
521 else:
--> 522 rdd, schema = self._createFromLocal(map(prepare, data), schema)
523 jrdd = self._jvm.SerDeUtil.toJavaArray(rdd._to_Java_object_rdd())
524 jdf = self._jsparkSession.applySchemaToPythonRDD(jrdd.rdd(), schema.json())
/usr/local/spark-latest/python/pyspark/sql/session.py in _createFromLocal(self, data, schema)
384
385 if schema is None or isinstance(schema, (list, Tuple)):
--> 386 struct = self._inferSchemaFromList(data)
387 if isinstance(schema, (list, Tuple)):
388 for i, name in enumerate(schema):
/usr/local/spark-latest/python/pyspark/sql/session.py in _inferSchemaFromList(self, data)
318 schema = reduce(_merge_type, map(_infer_schema, data))
319 if _has_nulltype(schema):
--> 320 raise ValueError("Some of types cannot be determined after inferring")
321 return schema
322
ValueError: Some of types cannot be determined after inferring
Quelqu'un sait-il ce que signifie l'erreur ci-dessus? Merci!
Afin d'inférer le type de champ, PySpark examine les enregistrements non nulles dans chaque champ. Si un champ n'a que des enregistrements Aucun, PySpark ne peut pas en déduire le type et générera cette erreur.
La définition manuelle d'un schéma résoudra le problème
>>> from pyspark.sql.types import StructType, StructField, StringType
>>> schema = StructType([StructField("foo", StringType(), True)])
>>> df = spark.createDataFrame([[None]], schema=schema)
>>> df.show()
+----+
|foo |
+----+
|null|
+----+
Si vous utilisez la méthode RDD[Row].toDF()
patché par des singes, vous pouvez augmenter le taux d'échantillonnage pour vérifier plus de 100 enregistrements lors de la déduction de types:
# Set sampleRatio smaller as the data size increases
my_df = my_rdd.toDF(sampleRatio=0.01)
my_df.show()
En supposant qu'il y ait des lignes non nulles dans tous les champs de votre RDD, il sera plus probable de les trouver lorsque vous augmentez le sampleRatio
vers 1.0.
Et pour résoudre ce problème, vous pouvez fournir votre propre schéma défini.
Par exemple:
Pour reproduire l'erreur:
>>> df = spark.createDataFrame([[None, None]], ["name", "score"])
Pour corriger l'erreur:
>>> from pyspark.sql.types import StructType, StructField, StringType, DoubleType
>>> schema = StructType([StructField("name", StringType(), True), StructField("score", DoubleType(), True)])
>>> df = spark.createDataFrame([[None, None]], schema=schema)
>>> df.show()
+----+-----+
|name|score|
+----+-----+
|null| null|
+----+-----+
J'ai rencontré ce même problème, si vous n'avez pas besoin des colonnes nulles, vous pouvez simplement les supprimer de la trame de données pandas avant d'importer dans spark:
my_df = my_df.dropna(axis='columns', how='all') # Drops columns with all NA values
spark_my_df = sc.createDataFrame(my_df)
Cela est probablement dû aux colonnes qui ont toutes des valeurs nulles. Vous devez supprimer ces colonnes avant de les convertir en un spark dataframe