1

Я использую искру 1.4.1. Когда я пытаюсь транслировать модель случайного леса он показывает мне эту ошибку:Широковещательная модель Random-Forest в PySpark

Traceback (most recent call last): 
    File "/gpfs/haifa/home/d/a/davidbi/codeBook/Nice.py", line 358, in <module> 
broadModel = sc.broadcast(model) 
    File "/opt/apache/spark-1.4.1-bin-hadoop2.4_doop/python/lib/pyspark.zip/pyspark/context.py", line 698, in broadcast 
    File "/opt/apache/spark-1.4.1-bin-hadoop2.4_doop/python/lib/pyspark.zip/pyspark/broadcast.py", line 70, in __init__ 
    File "/opt/apache/spark-1.4.1-bin-hadoop2.4_doop/python/lib/pyspark.zip/pyspark/broadcast.py", line 78, in dump 
File "/opt/apache/spark-1.4.1-bin-hadoop2.4_doop/python/lib/pyspark.zip/pyspark/context.py", line 252, in __getnewargs__ 
Exception: It appears that you are attempting to reference SparkContext from a broadcast variable, action, or transforamtion. SparkContext can only be used on the driver, not in code that it run on workers. For more information, see SPARK-5063. 

пример кода я пытаюсь выполнить:

sc = SparkContext(appName= "Something") 
model = RandomForest.trainRegressor(sc.parallelize(data), categoricalFeaturesInfo=categorical, numTrees=100, featureSubsetStrategy="auto", impurity='variance', maxDepth=4) 
broadModel= sc.broadcast(model) 

Если кто-то может помочь мне с этим я буду будьте очень благодарны! Спасибо большое!

+0

Есть ли причина, почему вам нужно, чтобы передать всю модель? Модель может запускать прогнозы на RDD входов. – Magsol

+0

существует более одной модели (в моем случае каждая модель определяет группу). каждый образец должен получить прогноз от каждой модели, чтобы узнать, какая группа он больше всего. Я обрабатываю большие данные, поэтому мне нужно передавать модели на карту. – dadibiton

ответ

1

Короткий ответ - это невозможно использовать PySpark. callJavaFunc, который необходим для прогнозирования, использует ошибку SparkContext. Было бы возможно сделать что-то подобное, используя Scala API.

В Python вы можете использовать тот же подход, что и для одной модели, это означает model.predict, а затем zip.

models = [mode1, mode2, mode3] 

predictions = [ 
    model.predict(testData.map(lambda x: x.features)) for model in models] 

def flatten(x): 
    if isinstance(x[0], tuple): 
     return tuple(list(x[0]) + [x[1]]) 
    else: 
     return x 

(testData 
    .map(lambda lp: lp.label) 
    .zip(reduce(lambda p1, p2: p1.zip(p2).map(flatten), predictions))) 

Если хотите узнать больше об источнике проблемы, пожалуйста, проверьте: How to use Java/Scala function from an action or a transformation?

 Смежные вопросы

  • Нет связанных вопросов^_^