8

フィーチャーの列の列を索引付けするときにPySparkに奇妙な問題があります。ここに私のtmp.csvファイルがあります:不足している機能に遭遇したときにApache SparkがNullPointerExceptionをスローする

x0,x1,x2,x3 
asd2s,1e1e,1.1,0 
asd2s,1e1e,0.1,0 
,1e3e,1.2,0 
bd34t,1e1e,5.1,1 
asd2s,1e3e,0.2,0 
bd34t,1e2e,4.3,1 

ここで私は 'x0'の欠損値が1つあります。 https://github.com/seahboonsiew/pyspark-csv その後、StringIndexerとX0インデックスを作成:

import pyspark_csv as pycsv 
from pyspark.ml.feature import StringIndexer 

sc.addPyFile('pyspark_csv.py') 

features = pycsv.csvToDataFrame(sqlCtx, sc.textFile('tmp.csv')) 
indexer = StringIndexer(inputCol='x0', outputCol='x0_idx') 
ind = indexer.fit(features).transform(features) 
print ind.collect() 

'' ind.collectを() 'を呼び出すとき、' スパークがjava.lang.NullPointerExceptionが発生しますがまず、私はpyspark_csvを使用してデータフレームにcsvファイルから機能を読んでいる時に 。しかし、 'x1'のように完全なデータセットの場合はすべて正常に動作します。

誰かがこれを引き起こしている原因と解決方法を手掛かりにしていますか?

ありがとうございます!

セルゲイ

更新:

私はスパーク1.5.1を使用しています。正確なエラー:

File "/spark/spark-1.4.1-bin-hadoop2.6/python/pyspark/sql/dataframe.py", line 258, in show 
print(self._jdf.showString(n)) 

File "/spark/spark-1.4.1-bin-hadoop2.6/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py", line 538, in __call__ 

File "/spark/spark-1.4.1-bin-hadoop2.6/python/lib/py4j-0.8.2.1-src.zip/py4j/protocol.py", line 300, in get_return_value 

py4j.protocol.Py4JJavaError: An error occurred while calling o444.showString. 
: java.lang.NullPointerException 
at org.apache.spark.sql.types.Metadata$.org$apache$spark$sql$types$Metadata$$hash(Metadata.scala:208) 
at org.apache.spark.sql.types.Metadata$$anonfun$org$apache$spark$sql$types$Metadata$$hash$2.apply(Metadata.scala:196) 
at org.apache.spark.sql.types.Metadata$$anonfun$org$apache$spark$sql$types$Metadata$$hash$2.apply(Metadata.scala:196) 
... etc 

私は

、csvファイルを読み込むことなく、同じデータフレームを作成するために

df = sqlContext.createDataFrame(
    [('asd2s','1e1e',1.1,0), ('asd2s','1e1e',0.1,0), 
    (None,'1e3e',1.2,0), ('bd34t','1e1e',5.1,1), 
    ('asd2s','1e3e',0.2,0), ('bd34t','1e2e',4.3,1)], 
    ['x0','x1','x2','x3']) 
を試みた、それは同じエラーを与えます。私はちょうどScalaで同じ問題を発見した

ので、私はそれがスパークのバグではないPySparkだけだと思う​​。少し異なる例が

df = sqlContext.createDataFrame(
    [(0, None, 1.2), (1, '06330986ed', 2.3), 
    (2, 'b7584c2d52', 2.5), (3, None, .8), 
    (4, 'bd17e19b3a', None), (5, '51b5c0f2af', 0.1)], 
    ['id', 'x0', 'num']) 

// after indexing x0 

+---+----------+----+------+ 
| id|  x0| num|x0_idx| 
+---+----------+----+------+ 
| 0|  null| 1.2| 0.0| 
| 1|06330986ed| 2.3| 2.0| 
| 2|b7584c2d52| 2.5| 4.0| 
| 3|  null| 0.8| 0.0| 
| 4|bd17e19b3a|null| 1.0| 
| 5|51b5c0f2af| 0.1| 3.0| 
+---+----------+----+------+ 

更新、2を正常に動作します。特に、データフレーム

val df = sqlContext.createDataFrame(
    Seq(("asd2s","1e1e",1.1,0), ("asd2s","1e1e",0.1,0), 
     (null,"1e3e",1.2,0), ("bd34t","1e1e",5.1,1), 
     ("asd2s","1e3e",0.2,0), ("bd34t","1e2e",4.3,1)) 
).toDF("x0","x1","x2","x3") 

「x0」機能をインデックスするときにthrows java.lang.NullPointerExceptionが発生します。第五ベクトルに欠けている「NUM」の値によって引き起こされる次のデータフレームに

val df = sqlContext.createDataFrame(
    Seq((0, null, 1.2), (1, "b", 2.3), 
     (2, "c", 2.5), (3, "a", 0.8), 
     (4, "a", null), (5, "c", 0.1)) 
).toDF("id", "x0", "num") 

を「X0」をインデックスするときまた、私は「タイプのスキーマの任意のサポートされていないjava.lang.UnsupportedOperationExceptionが」を持っています。 1つ目のベクトルに欠損値があっても、数値で置き換えればすべてうまく動作します。

私はSpark(1.4.1)の古いバージョンも試しましたが、結果は同じです。

答えて

6

使用しているモジュールのように、空の文字列をNULLに変換して、下流の処理で何らかの点で困惑しています。一見してit looks like a PySpark bug

修正方法?

features.na.drop() 

またはいくつかのプレースホルダでNULLを置き換える:簡単な回避策は、インデックス化の前にヌルを落とすのいずれかにある

また
from pyspark.sql.functions import col, when 

features.withColumn(
    "x0", when(col("x0").isNull(), "__SOME_PLACEHOLDER__").otherwise(col("x0"))) 

、あなたはspark-csvを使用することができます。それは効率的で、テストされており、ボーナスは空文字列をnullsに変換しません。

features = (sqlContext.read 
    .format('com.databricks.spark.csv') 
    .option("inferSchema", "true") 
    .option("header", "true") 
    .load("tmp.csv")) 
0
まあ@ zero323提案のようにNAのを取り除くために、現在、唯一の解決策がされ

またはtoPandas()メソッドを使用してパンダDATAFRAMEにスパークデータフレームを変換し、sklearn Imputerまたは任意のカスタムimputer、例えばを使用してデータを転嫁します、Impute categorical missing values in scikit-learn、次にPandas DataframeをSpark DataFrameに変換し、それを処理します。それでも問題は残っていますが、バグレポートがあれば提出してみます。私はSparkには比較的新しいので、何かが欠けている可能性があります。

関連する問題