Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何在没有DataFrames/SparkContext的情况下评估spark.ml模型?_Apache Spark_Apache Spark Mllib_Apache Spark Ml - Fatal编程技术网

Apache spark 如何在没有DataFrames/SparkContext的情况下评估spark.ml模型?

Apache spark 如何在没有DataFrames/SparkContext的情况下评估spark.ml模型?,apache-spark,apache-spark-mllib,apache-spark-ml,Apache Spark,Apache Spark Mllib,Apache Spark Ml,使用Spark MLLib,我将构建一个模型(如RandomForest),然后通过加载模型并使用predict传递特征向量,可以在Spark之外对其进行评估 似乎在Spark ML中,predict现在被称为transform,只作用于数据帧 有没有办法在Spark之外构建数据帧,因为构建数据帧似乎需要SparkContext 我遗漏了什么吗?Re:有没有办法在Spark之外构建数据帧 这是不可能的。数据帧存在于SQLContext中,而它存在于SparkContext中。也许你可以设法解决这

使用Spark MLLib,我将构建一个模型(如
RandomForest
),然后通过加载模型并使用
predict
传递特征向量,可以在Spark之外对其进行评估

似乎在Spark ML中,
predict
现在被称为
transform
,只作用于
数据帧

有没有办法在Spark之外构建
数据帧
,因为构建数据帧似乎需要SparkContext

我遗漏了什么吗?

Re:有没有办法在Spark之外构建数据帧


这是不可能的。数据帧存在于SQLContext中,而它存在于SparkContext中。也许你可以设法解决这个问题,但总的来说,数据帧和SparkContext之间的连接是经过设计的。

以下是我在spark上下文之外使用spark模型的解决方案(使用PMML):

  • 使用以下管道创建模型:
  • SparkConf SparkConf=new SparkConf()

    SparkSession session=SparkSession.builder().enablehavesupport().config(sparkConf.getOrCreate();
    String tableName=“schema.table”;
    Properties dbProperties=新属性();
    setProperty(“用户”,vKey);
    setProperty(“密码”,password);
    setProperty(“AuthMech”,“3”);
    setProperty(“源”、“jdbc”);
    setProperty(“driver”,“com.cloudera.impala.jdbc41.driver”);
    String tableName=“schema.table”;
    String simplerl=“jdbc:impala://host:21050/schema"
    Dataset data=session.read().jdbc(simplerl、tableName、dbProperties);
    字符串[]inputCols={“column1”};
    StringIndexer indexer=新的StringIndexer().setInputCol(“column1”).setOutputCol(“indexed_column1”);
    StringIndexerModel alphabet=indexer.fit(数据);
    数据=字母表。转换(数据);
    VectorAssembler assembler=新的VectorAssembler().setInputCols(inputCols).setOutputCol(“功能”);
    预测器p=新的GBTRegressor();
    p、 设置(“maxIter”,20);
    p、 设置(“最大深度”,2);
    p、 设置(“maxBins”,204);
    p、 setLabelCol(“faktor”);
    PipelineStage[]stages={indexer,assembler,p};
    管道=新管道();
    管道安装阶段(阶段);
    PipelineModel pmodel=pipeline.fit(数据);
    PMML PMML=ConverterUtil.toPMML(data.schema(),pmodel);
    FileOutputStream fos=新的FileOutputStream(“model.pmml”);
    marshalpml(pmml,newstreamresult(fos));
    
  • 使用PPML进行预测(本地,无spark上下文,可应用于参数映射,而非数据帧):

    PMML-PMML=org.jpmml.model.PMMLUtil.unmarshal(新文件输入流(pmmlFile));
    ModelEvaluatorFactory ModelEvaluatorFactory=ModelEvaluatorFactory.newInstance();
    MiningModelEvaluator evaluator=(MiningModelEvaluator)modelEvaluatorFactory.newModelEvaluator(pmml);
    inputFieldMap=新HashMap();
    Map args=new HashMap();
    字段curField=evaluator.getInputFields().get(0);
    args.put(curField.getName(),“1.0”);
    映射结果=evaluator.evaluate(args);
    

  • 在这个问题上也花了很多天。这并不简单。我的第三个建议涉及我专门为此编写的代码

    选项1

    正如其他评论者所说,现在可以使用。但是,您需要知道如何构造向量。如果没有,请参见选项3

    选项2

    如果目标是避免设置Spark服务器(独立或群集模式),则可以在本地模式下启动Spark。整个过程将在单个JVM中运行

    val spark = SparkSession.builder().config("spark.master", "local[*]").getOrCreate()
    // create dataframe from file, or make it up from some data in memory
    // use model.transform() to get predictions
    
    但这会给预测模块带来不必要的依赖,并且在运行时会消耗JVM中的资源。此外,如果预测延迟非常关键,例如,在请求传入后的毫秒内进行预测,则此选项速度太慢

    选项3

    MLlib的输出可以用作学习者的输入。该类适用于一次热编码,也适用于固定特征维度的大小。即使所有功能都是数字,也可以使用它。如果您在培训中使用它,那么您在预测时所需要的只是散列逻辑。它作为一个火花变压器,所以在火花环境之外不容易重复使用。因此,我已经完成了将哈希函数提取到lib的工作。在培训期间,您可以正常地应用FeatureHasher和学习者。下面是如何在预测时使用精简的哈希器:

    // Schema and hash size must stay consistent across training and prediction
    val hasher = new FeatureHasherLite(mySchema, myHashSize)
    
    // create sample data-point and hash it
    val feature = Map("feature1" -> "value1", "feature2" -> 2.0, "feature3" -> 3, "feature4" -> false)
    val featureVector = hasher.hash(feature)
    
    // Make prediction
    val prediction = model.predict(featureVector)
    

    您可以在我的github中查看详细信息,网址为。如果你想复制我的代码,请看一下。这里还有示例代码和单元测试。如果您需要帮助,请随意创建问题。

    它仍然有
    predict
    predictprobability
    predictRaw
    处理向量的方法,您不能使用它们吗?我在文档中没有看到这些方法:您在spark.ml中看到RandomForest的哪些方法?理论上,您可能可以编写一个从ml扩展RFClassictionaModel(使用scala包)的类,并使一些公共方法公开上述受保护的方法,但不确定这是否是最好的方法。您不能使用
    mllib
    包中的实现吗?我不确定他们是否仍然支持它,但我的理解是spark ml取代了mllib,而mllib在某个时候将被弃用。我以前使用过mllib,但我正在尝试获取每个类的概率,并且该功能仅在最近才可用,并且仅在spark ml实现上可用。是的,不幸的是,您是正确的。。。你看过H2O吗?不确定他们是否有你正在寻找的概率(;-),但在那里你可以将你的模型导出为pojo,并在任何地方使用它们好吧,这不是我想要听到的答案。。。如果是这样的话,Spark似乎正在倒退。这是一个强大的工具来训练模型,但被迫使用它来评估是很烦人的。有没有一种方法可以将模型导出为无需DataFramesTh即可使用的格式
    val spark = SparkSession.builder().config("spark.master", "local[*]").getOrCreate()
    // create dataframe from file, or make it up from some data in memory
    // use model.transform() to get predictions
    
    // Schema and hash size must stay consistent across training and prediction
    val hasher = new FeatureHasherLite(mySchema, myHashSize)
    
    // create sample data-point and hash it
    val feature = Map("feature1" -> "value1", "feature2" -> 2.0, "feature3" -> 3, "feature4" -> false)
    val featureVector = hasher.hash(feature)
    
    // Make prediction
    val prediction = model.predict(featureVector)