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
如何管理JavaRDD<;标签点>;Spark中的数据结构_Java_Apache Spark - Fatal编程技术网

如何管理JavaRDD<;标签点>;Spark中的数据结构

如何管理JavaRDD<;标签点>;Spark中的数据结构,java,apache-spark,Java,Apache Spark,我有这样一个数据文件: "id"; "a"; "b"; "c"; "d"; "e"; "f"; "outcome" 1144216938;1988;0;0;1;1965.115431348724;19.07168894289186;0 1093965329;2004;1;1;1;302.2244897959184;16.762951334379906;1 .... 第一列表示每个案例的id标签,而最后一列表示二进制结果(0或1)。这两个变量之间的所有变量都用于逻辑回归模型(我还没有将它们归一化

我有这样一个数据文件:

"id"; "a"; "b"; "c"; "d"; "e"; "f"; "outcome"
1144216938;1988;0;0;1;1965.115431348724;19.07168894289186;0
1093965329;2004;1;1;1;302.2244897959184;16.762951334379906;1
....
第一列表示每个案例的id标签,而最后一列表示二进制结果(0或1)。这两个变量之间的所有变量都用于逻辑回归模型(我还没有将它们归一化)。我在Spark中阅读了该文件:

JavaRDD<String> data = sc.textFile(filename);
JavaRDD<LabeledPoint> parseddata = data
    .map((String line) -> {
        String[] parts = line.split(";");
        double[] points = new double[parts.length - 1];
        for (int i = 0; i < (parts.length - 1); i++) {
            points[i] = Double.valueOf(parts[i]);
        }
        return new LabeledPoint(Double.valueOf(parts[parts.length - 1]), Vectors.dense(points));
    });
javarddata=sc.textFile(文件名);
JavaRDD parseddata=数据
.map((字符串行)->{
String[]parts=line.split(“;”);
double[]点=新的double[parts.length-1];
对于(int i=0;i<(parts.length-1);i++){
点[i]=第[i]部分的双值;
}
返回新的标签点(Double.valueOf(parts[parts.length-1]),Vectors.dense(points));
});
我不熟悉LabeledPoint数据结构,所以这可能很容易解决,但我不明白如何。。。所以我有三个相关的问题:

  • 如何去掉文件头?现在我只是将其从文件中删除:
编辑 根据eliasah的评论,这应该可以做到:

    // retrieve the header
    String first = data.first();
    // filter it out
    JavaRDD<String> filteredData = data.filter((String s) -> {
       return !s.contains(first);
    });
//检索标题
String first=data.first();
//过滤掉
JavaRDD Filteredata=data.filter((字符串s)->{
返回!s.contains(第一);
});
结束编辑

  • 是否有方法将第一列映射为行名称,以便将其从回归模型中使用的点中排除?除了使用:

    for (int i = 1; i < (parts.length - 1); i++) {
        points[i] = Double.valueOf(parts[i]);
    }
    
    for(int i=1;i<(parts.length-1);i++){
    点[i]=第[i]部分的双值;
    }
    
  • 最后,当我使用以下工具从回归模型检索预测时,如何将预测映射到正确的“id”:

    JavaRDD<Tuple2<Object, Object>> predictionAndLabels = test.map((LabeledPoint p) -> {
       Double prediction = model.predict(p.features());
       return new Tuple2<Object, Object>(prediction, p.label());
    });
    
    javarddpredictionandlabels=test.map((LabeledPoint p)->{
    双重预测=model.predict(p.features());
    返回新的Tuple2(prediction,p.label());
    });
    
编辑2 尽管答案说明了一切,但我能想到的是:

JavaRDD<Tuple2<Object, Object>> results = filteredData.map((String line) -> {
        String[] parts = line.split(";");
        double[] points = new double[parts.length - 1];
        //skip first column with npi values
        for (int i = 1; i < (parts.length - 1); i++) {
            points[i] = Double.valueOf(parts[i]);
        }
        LabeledPoint labeledPoint = new LabeledPoint(Double.valueOf(parts[parts.length - 1]), Vectors.dense(points));
        return new Tuple2<Object, Object>(parts[0], model.predict(labeledPoint.features()));
    });
javarddresults=filteredData.map((字符串行)->{
String[]parts=line.split(“;”);
double[]点=新的double[parts.length-1];
//使用npi值跳过第一列
对于(int i=1;i<(parts.length-1);i++){
点[i]=第[i]部分的双值;
}
LabeledPoint LabeledPoint=新的LabeledPoint(Double.valueOf(parts[parts.length-1]),Vectors.dense(points));
返回新的Tuple2(parts[0],model.predict(labeledPoint.features());
});
这是一个遗憾,因为我基本上是重做地图再次。。。这是正确的方法吗

编辑3

感谢eliasah的其他评论,我现在过滤如下数据:

JavaRDD<Tuple2<String, LabeledPoint>> parsedData = filteredData.map((String line) -> {
 String[] parts = line.split(";");
 double[] points = new double[parts.length - 1];
 for (int i = 1; i < (parts.length - 1); i++) {
     points[i] = Double.valueOf(parts[i]);
 }
 return new Tuple2<String, LabeledPoint>(parts[0], new LabeledPoint(Double.valueOf(parts[parts.length - 1]), Vectors.dense(points)));
 });
JavaRDD parsedData=filteredData.map((字符串行)->{
String[]parts=line.split(“;”);
double[]点=新的double[parts.length-1];
对于(int i=1;i<(parts.length-1);i++){
点[i]=第[i]部分的双值;
}
返回新的Tuple2(parts[0],新的标签点(Double.valueOf(parts[parts.length-1]),Vectors.dense(points));
});
我将此用于培训:

JavaRDD<LabeledPoint> training = parsedData
     .map((Tuple2<String, LabeledPoint> z) -> {
         return z._2();
     });
JavaRDD training=parsedData
.map((Tuple2 z)->{
返回z._2();
});
并检索我的每个案例的概率:

JavaRDD<Tuple2<String, Double>> results = parsedData
     .map((Tuple2<String, LabeledPoint> z) -> {
         return new Tuple2<String, Double>(z._1(), model.predict(z._2().features()));
     });
javarddresults=parsedData
.map((Tuple2 z)->{
返回新的Tuple2(z._1(),model.predict(z._2().features());
});

关于标题,我通常使用的标题是rdd。首先()获取标题,然后是rdd上的过滤器:

String header = data.first();
JavaRDD<String> filteredData = data.filter((String s) -> {
   return !s.contains(header);
});

关于标题,我通常使用的标题是rdd。首先()获取标题,然后是rdd上的过滤器:

String header = data.first();
JavaRDD<String> filteredData = data.filter((String s) -> {
   return !s.contains(header);
});

关于标题,我通常使用的标题是rdd。首先()获取标题,然后在rdd上使用过滤器。至于点,使用Scala I映射到第二部分,然后根据向量是稀疏的还是密集的,我创建向量。关于最后一个问题,我不确定我是否理解你的意思。嗨,谢谢你的时间。。。假设id=1144216938,在我运行回归后,如何找到该id的预测值?映射到你的标签点(标签,特征),如果标签=id,模型预测与特征有关的标题,我通常使用标题是rdd。首先()获取标题,然后在rdd上使用过滤器。至于点,使用Scala,我映射到第二部分,然后根据向量是稀疏的还是密集的,我创建的向量也是稀疏的。关于最后一个问题,我不确定我是否理解你的意思。嗨,谢谢你的时间。。。假设id=1144216938,在我运行回归后,如何找到该id的预测值?映射到您的标签点(标签,特征),如果标签=id,则使用特征进行模型预测,直到我无法在Java中找出如何跟踪我的id标签点…:(应该在您的部分[0]在你做分割之后,这是一种方法。不是最优的。但是正确。唯一遗憾的是你丢失了关于创建的标签点的信息。我宁愿创建一个id的RDD,标签点,然后映射来计算预测。你可能需要对特征向量进行缩放规格化。你不想再重新计算了我们在这里的线索…只是最后一个想法:当我有一个JavaRDD时,我无法将数据传递给模型进行训练,因为它需要一个RDD…你需要将你的RDD[(字符串,标签点)]映射到RDD[标签点]。例如,在Scalastill中的map(u.2),我无法在Java中找出如何跟踪我的id标签点…:(它应该在你的部分[0]在你做分割之后,这是一种方法。不是最优的。但是正确。唯一遗憾的是你丢失了关于创建的标签点的信息。我宁愿创建一个id的RDD,标签点,然后映射来计算预测。你可能需要对特征向量进行缩放规格化。你不想再重新计算了我们在这里的领导…最后一个想法:当我有一个JavaRDD时,我不能