PySpark-在数据框上使用randomSplit错误

时间:2018-07-04 17:18:02

标签: python apache-spark pyspark apache-spark-mllib

我已经用我的数据创建了一个DataFrame来运行一些机器学习实验。我试图通过使用randomSplit()函数将其分为训练集和测试集,但是它给了我一些我无法弄清原因的例外。我的代码与此类似:

Features = ['A', 'B', 'C', 'D', 'E', 'aVec', 'bVec', 'cVec', 'dVec']

vec = VectorAssembler(inputCols = Features, outputCol = 'features')
df = vec.transform(df)
df = df.select("features", "Target")

(train, test) = df.randomSplit([0.8, 0.2])

print(df.count())

print(train.count())
print(test.count())

“功能”中的字母表示数字功能,* Vec元素表示OneHotEncoding矢量(使用pyspark的OneHotEncoding()函数创建)。

当Spark到达print(train.count())时,它将启动以下异常:

Py4JJavaError: An error occurred while calling o2274.count.
: org.apache.spark.SparkException: Job aborted due to stage failure: 
Task 5 in stage 1521.0 failed 1 times, most recent failure: Lost task 
5.0 in stage 1521.0 (TID 122477, localhost, executor driver): 
java.lang.IllegalAccessError: tried to access field 
org.apache.spark.sql.execution.BufferedRowIterator.partitionIndex from 
class 

df上的打印效果很好,所以我认为randomSplit正在某种程度上破坏我的数据。

我做了一个小测试,并且如果我删除了任何OneHotEncoding矢量,它由于某种原因便开始工作。 (例如,我删除了“ aVec”,它起作用了)。该问题似乎与特定列无关,因为我可以删除其中的任何列(如果我使用Features = ['aVec','bVec','cVec']或Features = ['bVec','cVec运行我的代码','dVec']可以正常运行,但不适用于Features = ['aVec','bVec','cVec','dVec'])。

我是否遇到此错误的原因?

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,我的问题通过从数据中删除空白值来解决。我在inputcol之一中有几个空白值,它们不是NA或NULL,而是一个空格:“”。这导致了您在上面描述的相同错误。我使用raw_data = raw_data.filter('YourColumn != " "')过滤掉了它们。

希望这对您也有帮助。

答案 1 :(得分:0)

我最近也遇到了类似的问题, 使VectorAssembler处理数据框中的无效条目解决了我的问题: df = vec.transform(df).setHandleInvalid("skip").transform(df)