web-dev-qa-db-fra.com

pyspark: ValueError: Certains types ne peuvent pas être déterminés après déduction

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!

18
Edamame

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|
+----+
22
Gregology

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.

3
rjurney

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|
+----+-----+
3
Akavall

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)
0
Aaronrobeson

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

0
Kamaldeep Singh