web-dev-qa-db-ja.com

pyspark:ValueError:一部のタイプは推論後に決定できません

pandasデータフレームmy_dfがあり、my_df.dtypesで次のようになります。

ts              int64
fieldA         object
fieldB         object
fieldC         object
fieldD         object
fieldE         object
dtype: object

次に、pandasデータフレームmy_dfをsparkデータフレームに以下のようにして変換します。

spark_my_df = sc.createDataFrame(my_df)

ただし、次のエラーが発生しました。

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

上記のエラーの意味を誰かが知っていますか?ありがとう!

18
Edamame

フィールドタイプを推測するために、PySparkは各フィールドのnon-noneレコードを調べます。フィールドにNoneレコードしかない場合、PySparkは型を推測できず、そのエラーが発生します。

スキーマを手動で定義すると問題が解決します

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

RDD[Row].toDF() monkey-patchedメソッドを使用している場合は、サンプル比率を増やして、型を推論するときに100を超えるレコードをチェックできます。

# Set sampleRatio smaller as the data size increases
my_df = my_rdd.toDF(sampleRatio=0.01)
my_df.show()

RDDのすべてのフィールドにnull以外の行があると仮定すると、sampleRatioを1.0に増やすと、それらの行が見つかりやすくなります。

3
rjurney

そして、この問題を修正するために、独自に定義したスキーマを提供できます。

例えば:

エラーを再現するには:

>>> df = spark.createDataFrame([[None, None]], ["name", "score"])

エラーを修正するには:

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

これと同じ問題が発生しました。nullの列が必要ない場合は、sparkにインポートする前に、pandas dataframeからドロップするだけです。

my_df = my_df.dropna(axis='columns', how='all') # Drops columns with all NA values
spark_my_df = sc.createDataFrame(my_df)
0
Aaronrobeson

これはおそらく、すべてnull値を持つ列が原因です。これらの列をspark dataframeに変換する前に削除する必要があります

0
Kamaldeep Singh