Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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
Spark—将列从RDD或数据帧映射到JAVA中的变量_Java_Apache Spark_Cassandra_Datastax Java Driver - Fatal编程技术网

Spark—将列从RDD或数据帧映射到JAVA中的变量

Spark—将列从RDD或数据帧映射到JAVA中的变量,java,apache-spark,cassandra,datastax-java-driver,Java,Apache Spark,Cassandra,Datastax Java Driver,我试图将Spark RDD中的cassandra行列映射到可以在Spark中进行交互操作的变量,但似乎无法将它们转换为变量。我有以下代码: JavaRDD<MeasuredValue> rdd = javaFunctions(sc).cassandraTable("model", "reports", mapRowTo (MeasuredValue.class)) .select("start_frequency","bandwidth", "power"); Ja

我试图将Spark RDD中的cassandra行列映射到可以在Spark中进行交互操作的变量,但似乎无法将它们转换为变量。我有以下代码:

JavaRDD<MeasuredValue> rdd = javaFunctions(sc).cassandraTable("model", "reports", mapRowTo (MeasuredValue.class))
   .select("start_frequency","bandwidth", "power");


    JavaRDD<Value> valueRdd = rdd.flatMap(row-> {
        double start_frequency = row.getStartFrequency();
        float power = row.getPower();
        double bandwidth = row.getBandwidth(); 


        List<Value> list = new ArrayList<Value>();
     // Create Channel Power Buckets    
        for(channel = 1.6000E8; channel <= channel_end;  ){ 
            if( (channel >= start_frequency) && (channel <= (start_frequency + bandwidth)) ) {     
             list.add(new Value(channel, power));
            }  // end if
            channel+=increment;
        }  // end for      

    }) 
我尝试使用lambda平面映射行的尝试似乎是错误的,因为我得到了以下错误:

无法应用类AbstractJavaRDDLike中的方法flatMap 对给定的类型;必需:找到FlatMapFunction: (行)->{d[…];}}原因:无法推断类型变量U(参数 不匹配;lambda表达式中的返回类型错误(缺少返回值)

我在“创建通道功率桶”循环中遇到错误

“从lambda表达式引用的局部变量必须是final 或实际上是最终的”


如果我可以用一个数据帧来做这件事,我会有兴趣看到代码来促进这一点。

发现答案是:

JavaRDD<MeasuredValue> rdd = javaFunctions(sc).cassandraTable("SB1000_47130646", "Measured_Value", mapRowTo(MeasuredValue.class));
JavaRDD<Value> valueRdd = rdd.flatMap(new FlatMapFunction<MeasuredValue, Value>(){
@Override 
public Iterable<Value> call(MeasuredValue row) throws Exception { 
double start_frequency = row.getStart_frequency(); 
float power = row.getPower(); 
double bandwidth = row.getBandwidth(); 

// Define Variable 
double channel,channel_end, increment;  

// Initialize Variables 
channel_end = 1.6159E8; 
increment = 5000; 

List<Value> list = new ArrayList<Value>(); 
// Create Channel Power Buckets 
for(channel = 1.6000E8; channel <= channel_end; ){ 
if( (channel >= start_frequency) && (channel <= (start_frequency + bandwidth)) ) { 
list.add(new Value(channel, power)); 
} // end if 
channel+=increment; 
} // end for 

return list; 
}    
    });

    sqlContext.createDataFrame(valueRdd, Value.class).groupBy(col("channel"))
    .agg(min("power"), max("power"), avg("power"))
    .write().mode(SaveMode.Append)      
    .option("table", "results")
    .option("keyspace", "model")
    .format("org.apache.spark.sql.cassandra").save();

} // end session
} // End Compute 

public class Value implements Serializable {
    public Value(Double channel, Float power) {
        this.channel = channel;
        this.power = power;
    }
    Double channel;
    Float power;

    public void setChannel(Double channel) {
        this.channel = channel;
    }
    public void setPower(Float power) {
        this.power = power;
    }
    public Double getChannel() {
        return channel;
    }
    public Float getPower() {
        return power;
    }

    @Override
    public String toString() {
        return "[" +channel +","+power+"]";
    }
}

public static class MeasuredValue implements Serializable {

        public MeasuredValue() { }

        private double start_frequency;
        public double getStart_frequency() { return start_frequency; }
        public void setStart_frequency(double start_frequency) { this.start_frequency = start_frequency; }

        private double bandwidth ;
        public double getBandwidth() { return bandwidth; }
        public void setBandwidth(double bandwidth) { this.bandwidth = bandwidth; }

        private float power;    
        public float getPower() { return power; }
        public void setPower(float power) { this.power = power; }

    }
JavaRDD rdd=javaFunctions(sc).cassandraTable(“SB1000_47130646”,“测量值”,mapRowTo(MeasuredValue.class));
JavaRDD valueRdd=rdd.flatMap(新的flatMap函数(){
@凌驾
公共Iterable调用(MeasuredValue行)引发异常{
双启动_频率=行。getStart_频率();
float power=row.getPower();
double带宽=row.getBandwidth();
//定义变量
双通道,通道末端,增量;
//初始化变量
通道_端=1.6159E8;
增量=5000;
列表=新的ArrayList();
//创建通道功率桶

对于(通道=1.6000E8;通道=启动频率)和(通道我应该使用数据帧而不是RDD吗?第二条错误消息表明lambda中使用的一些变量没有声明为final-什么是
increment
channel\u end
变量?它们是
final
?它们的定义如下:
//定义变量双通道,channel\u end,start\fr频率,增量,带宽;浮点功率;长时间\u键;//初始化变量通道\u端=1.6159E8;增量=5000;
那么就这样了(或部分)-它们必须是最终的,例如,
final double channel_end=1.6159E8;
主要问题是能够将行-列值映射到变量。我可以从spark内部进行操作。
JavaRDD<MeasuredValue> rdd = javaFunctions(sc).cassandraTable("SB1000_47130646", "Measured_Value", mapRowTo(MeasuredValue.class));
JavaRDD<Value> valueRdd = rdd.flatMap(new FlatMapFunction<MeasuredValue, Value>(){
@Override 
public Iterable<Value> call(MeasuredValue row) throws Exception { 
double start_frequency = row.getStart_frequency(); 
float power = row.getPower(); 
double bandwidth = row.getBandwidth(); 

// Define Variable 
double channel,channel_end, increment;  

// Initialize Variables 
channel_end = 1.6159E8; 
increment = 5000; 

List<Value> list = new ArrayList<Value>(); 
// Create Channel Power Buckets 
for(channel = 1.6000E8; channel <= channel_end; ){ 
if( (channel >= start_frequency) && (channel <= (start_frequency + bandwidth)) ) { 
list.add(new Value(channel, power)); 
} // end if 
channel+=increment; 
} // end for 

return list; 
}    
    });

    sqlContext.createDataFrame(valueRdd, Value.class).groupBy(col("channel"))
    .agg(min("power"), max("power"), avg("power"))
    .write().mode(SaveMode.Append)      
    .option("table", "results")
    .option("keyspace", "model")
    .format("org.apache.spark.sql.cassandra").save();

} // end session
} // End Compute 

public class Value implements Serializable {
    public Value(Double channel, Float power) {
        this.channel = channel;
        this.power = power;
    }
    Double channel;
    Float power;

    public void setChannel(Double channel) {
        this.channel = channel;
    }
    public void setPower(Float power) {
        this.power = power;
    }
    public Double getChannel() {
        return channel;
    }
    public Float getPower() {
        return power;
    }

    @Override
    public String toString() {
        return "[" +channel +","+power+"]";
    }
}

public static class MeasuredValue implements Serializable {

        public MeasuredValue() { }

        private double start_frequency;
        public double getStart_frequency() { return start_frequency; }
        public void setStart_frequency(double start_frequency) { this.start_frequency = start_frequency; }

        private double bandwidth ;
        public double getBandwidth() { return bandwidth; }
        public void setBandwidth(double bandwidth) { this.bandwidth = bandwidth; }

        private float power;    
        public float getPower() { return power; }
        public void setPower(float power) { this.power = power; }

    }