我需要将记录插入到Cassandra中,所以我编写了一个输入为csv文件的函数。假设csv文件的名称是test.csv。在Cassandra,我有一个桌面测试。我需要将csv文件的每一行存储到测试表中。由于我使用的是spark java api,我还创建了一个POJO类或DTO类来映射Cassandra的Pojo和Columns字段。
这里的问题是test.csv有大约50个逗号分隔值,必须存储在cassandra的50列测试表中,总共有400列。所以在我的测试POJO类中,我创建了这50个字段的构造函数。
JavaRDD<String> fileRdd = ctx.textFile("home/user/test.csv");
JavaRDD fileObjectRdd = fileRdd.map(
new Function<String, Object>() {
//do some tranformation with data
switch(fileName){
case "test" :return new TestPojo(1,3,4,--50); //calling the constructor with 50 fields .
}
});
switch(fileName){
test : javaFunctions(fileObjectRdd).writerBuilder("testKeyspace", "test", mapToRow(TestPojo.class)).saveToCassandra();
}
所以这里我总是将test.csv文件的每一行的TestPojo类的Object返回给一个对象的Rdd。完成后,我将使用TestPojo映射将该rdd保存到Cassandra表测试中。
我的问题是将来如果test.csv会说60列,那个时候我的代码将无法工作,因为我只调用了50个字段的构造函数。
我的问题是如何创建一个包含TestPojo中所有400个字段的构造函数,这样无论test.csv有多少个字段,我的代码都应该能够处理它。
我尝试创建一个包含所有400个字段的通用构造函数,但最终出现了编译错误,说明构造函数参数的限制只有255个字段。
还是有更好的方法来处理这个用例?
问题2:如果来自test.csv的数据将转到cassandra中的多个表,那么在cassandra中将5个test.csv用于测试表,另外5个cols将用于cassandra中的test2表。
问题在于我正在做什么
JavaRDD fileObjectRdd = fileRdd.map(
new Function<String, Object>() {
//do some tranformation with data
switch(fileName){
case "test" :return new TestPojo(1,3,4,--50); //calling the constructor with 50 fields .
}
});
我只返回一个TestPojo对象。如果来自test.csv的数据将用于测试table和test2表,我将需要返回TestPojo和Test2Pojo中的另一个对象。