我已经用我的数据创建了一个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'])。
我是否遇到此错误的原因?
答案 0 :(得分:0)
我遇到了同样的问题,我的问题通过从数据中删除空白值来解决。我在inputcol之一中有几个空白值,它们不是NA或NULL,而是一个空格:“”。这导致了您在上面描述的相同错误。我使用raw_data = raw_data.filter('YourColumn != " "')
过滤掉了它们。
希望这对您也有帮助。
答案 1 :(得分:0)
我最近也遇到了类似的问题,
使VectorAssembler处理数据框中的无效条目解决了我的问题:
df = vec.transform(df).setHandleInvalid("skip").transform(df)