PySpark - ошибка при использовании randomSplit в Dataframe - PullRequest
0 голосов
/ 04 июля 2018

Я создал 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())

Буквы внутри 'Features' представляют числовые объекты, а элементы * Vec представляют векторы OneHotEncoding (созданные с помощью функции OneHotEncoding () pyspark).

Когда 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 ']).

Есть ли причина этой ошибки, которую я получаю?

1 Ответ

0 голосов
/ 02 августа 2018

У меня была такая же проблема, моя была решена путем удаления пустых значений из моих данных. У меня было несколько пустых значений в одном из входных протоколов, они были не NA или NULL, а просто пробел: "". Это вызвало ту же ошибку, которую вы описали выше. Я отфильтровал их, используя raw_data = raw_data.filter('YourColumn != " "').

Надеюсь, это поможет и вам.

...