我最初的问题是为什么在 map 函数中使用 DecisionTreeModel.predict 会引发异常? 并且与 How to generate tuples of (original lable, predicted label) on Spark with MLlib? 有关
当我们使用 Scala API 时 a recommended way使用 DecisionTreeModel 获取 RDD[LabeledPoint] 的预测是简单地映射 RDD:
val labelAndPreds = testData.map { point =>
val prediction = model.predict(point.features)
(point.label, prediction)
}
不幸的是,PySpark 中的类似方法效果不佳:
labelsAndPredictions = testData.map(
lambda lp: (lp.label, model.predict(lp.features))
labelsAndPredictions.first()
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.
取而代之的是 official documentation推荐这样的东西:
predictions = model.predict(testData.map(lambda x: x.features))
labelsAndPredictions = testData.map(lambda lp: lp.label).zip(predictions)
那么这里发生了什么?这里没有广播变量和Scala API定义 predict 如下:
/**
* Predict values for a single data point using the model trained.
*
* @param features array representing a single data point
* @return Double prediction from the trained model
*/
def predict(features: Vector): Double = {
topNode.predict(features)
}
/**
* Predict values for the given data set using the model trained.
*
* @param features RDD representing data points to be predicted
* @return RDD of predictions for each of the given data points
*/
def predict(features: RDD[Vector]): RDD[Double] = {
features.map(x => predict(x))
}
所以至少乍一看,从 Action 或转换中调用不是问题,因为预测似乎是本地操作。
经过一番挖掘,我发现问题的根源是 JavaModelWrapper.call从 DecisionTreeModel.predict 调用的方法.它access调用Java函数所需的SparkContext:
callJavaFunc(self._sc, getattr(self._java_model, name), *a)
在 DecisionTreeModel.predict 的情况下,有一个推荐的解决方法,所有必需的代码已经是 Scala API 的一部分,但是一般来说,有没有什么优雅的方法来处理这样的问题?
目前我能想到的只有重量级的解决方案:
最佳答案
使用默认 Py4J 网关进行通信是不可能的。要理解为什么我们必须查看 PySpark Internals 文档 [1] 中的下图:
由于 Py4J 网关在驱动程序上运行,因此无法通过套接字与 JVM worker 通信的 Python 解释器访问它(参见示例 PythonRDD/rdd.py )。
理论上可以为每个 worker 创建一个单独的 Py4J 网关,但实际上它不太可能有用。忽略诸如可靠性之类的问题 Py4J 根本就不是为执行数据密集型任务而设计的。
有什么解决方法吗?
使用 Spark SQL Data Sources API包装 JVM 代码。
优点:受支持,级别高,不需要访问内部 PySpark API
缺点:相对冗长且没有很好的记录,主要限于输入数据
使用 Scala UDF 对 DataFrame 进行操作。
优点:易于实现(参见 Spark: How to map Python with Scala or Java User Defined Functions? ),如果数据已存储在 DataFrame 中,则无需在 Python 和 Scala 之间进行数据转换,对 Py4J 的访问最少
缺点:需要访问 Py4J 网关和内部方法,仅限于 Spark SQL,难以调试,不支持
以类似于在 MLlib 中完成的方式创建高级 Scala 接口(interface)。
优点:灵活,能够执行任意复杂代码。它可以直接在 RDD 上(例如参见 MLlib model wrappers )或使用 DataFrames (参见 How to use a Scala class inside Pyspark )。后一种解决方案似乎更加友好,因为所有 ser-de 细节都已由现有 API 处理。
缺点:低级别,需要数据转换,与 UDF 一样需要访问 Py4J 和内部 API,不受支持
可以在 Transforming PySpark RDD with Scala 中找到一些基本示例
使用外部工作流管理工具在 Python 和 Scala/Java 作业之间切换,并将数据传递到 DFS。
优点:易于实现,对代码本身的改动最少
缺点:读取/写入数据的成本(Alluxio?)
使用共享的 SQLContext(参见示例 Apache Zeppelin 或 Livy)使用已注册的临时表在客户语言之间传递数据。
优点:非常适合交互式分析
缺点:对于批处理作业(Zeppelin)来说不是那么多,或者可能需要额外的编排(Livy)
关于python - 从任务中调用 Java/Scala 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47832817/
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www