代码之家  ›  专栏  ›  技术社区  ›  mithrix Suraj Kumar

类错误中找不到列

  •  1
  • mithrix Suraj Kumar  · 技术社区  · 9 年前

    我试图从卡桑德拉表中提取某些数据,然后将其写回卡桑德拉中的另一个表。

    这就是我所拥有的:

    JavaRDD<MeasuredValue> mvRDD = javaFunctions(sc).cassandraTable("SB1000_47130646", "Measured_Value", mapRowTo(MeasuredValue.class))
      .where ("\"Time_Key\" IN (1601823,1601824)")
      .select("Time_Key","Start_Frequency","Bandwidth", "Power");  
    

    然后我写回一个新表:

    javaFunctions(mvRDD).writerBuilder("spark_reports","SB1000_47130646", mapToRow(MeasuredValue.class)).withColumnSelector(someColumns("Time_Key", "Start_Frequency", "Bandwidth", "Power")).saveToCassandra();
    

    我的MeasuredValue类如下所示:

    public static class MeasuredValue implements Serializable {
    
    
    public MeasuredValue() { }
    
    public MeasuredValue(Long Time_Key, Double Start_Frequency, Double Bandwidth, Float Power) {
        this.Time_Key = Time_Key;
        this.Start_Frequency = Start_Frequency;
        this.Bandwidth = Bandwidth;
        this.Power = Power;
    
    }
    private Long Time_Key;
    public Long gettime_key() { return Time_Key; }
    public void settime_key(Long Time_Key) { this.Time_Key = Time_Key; }
    
    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;
    }
    

    运行时出现的错误是:

    Exception in thread "main" java.lang.IllegalArgumentException: requirement failed: Columns not found in class com.neutronis.spark_reports.Spark_Reports$MeasuredValue: [Time_Key, Start_Frequency, Bandwidth, Power]
    
    1 回复  |  直到 9 年前
        1
  •  4
  •   mithrix Suraj Kumar    8 年前

    我发现这是因为getter/setter在大写字母和变量方面都遵循JAVA命名方案。由于我的表中的列是驼峰大小写的,我不得不将列名重新配置为正确的全小写命名约定,以使其正常工作。

    为了使用大写字母,我必须使用HashMap:

     HashMap<String,String> colmap = new HashMap<String,String>();
        colmap.put( "start_frequency", "Start_Frequency" );
        colmap.put( "bandwith", "Bandwidth" );
        colmap.put( "power", "Power" );
        RowReaderFactory<MeasuredValue> mapRowTo = mapRowTo(MeasuredValue.class, colmap);