/**
* (按值统计)
*/
@RequestMapping("/value/{xColumnName}/{yColumnName}")
public R value(@PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName,HttpServletRequest request) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("xColumn", xColumnName);
params.put("yColumn", yColumnName);
EntityWrapper<BingxiangxinxiEntity> ew = new EntityWrapper<BingxiangxinxiEntity>();
List<Map<String, Object>> result = bingxiangxinxiService.selectValue(params, ew);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for(Map<String, Object> m : result) {
for(String k : m.keySet()) {
if(m.get(k) instanceof Date) {
m.put(k, sdf.format((Date)m.get(k)));
}
}
}
List<Map<String, Object>> result2 = new ArrayList<Map<String,Object>>();
for(Map<String, Object> m : result) {
List<Tuple2<String, Object>> data = new ArrayList<>();
for(String s : m.keySet()) {
data.add(new Tuple2<>(s, m.get(s)));
}
JavaPairRDD<String, Object> originRDD = javaSparkContext.parallelizePairs(data);
result2.add(originRDD.collectAsMap());
}
return R.ok().put("data", result2);
}
这段代码执行了一系列操作,旨在处理一些数据并将其转换为特定的格式,最后通过一个响应对象返回:
- 初始化参数和查询:
- 创建一个
Map<String, Object>
类型的params
,用于存储查询时需要的参数。这里xColumnName
和yColumnName
是已经定义好的字符串变量,代表要查询的列名。 - 调用
bingxiangxinxiService.selectValue(params, ew)
方法,传入参数和查询包装器,执行查询并返回一个List<Map<String, Object>>
类型的结果集result
。这个结果集可能包含多行数据,每行数据都是一个键值对映射,键是列名,值是对应的值。
- 创建一个
- 日期格式化:
- 遍历
result
中的每个映射(Map<String, Object>
),检查每个值的类型。如果值是Date
类型,则使用SimpleDateFormat
将其格式化为"yyyy-MM-dd"
格式的字符串,并替换原来的值。
- 遍历
- 与Apache Spark的交互(问题所在):
- 创建一个新的列表
result2
,意图是将result
中的数据以某种形式转换后存入。 - 再次遍历
result
中的每个映射m
,为每个映射创建一个List<Tuple2<String, Object>>
(这里假设Tuple2
是一个自定义的或来自某个库的类,用于存储键值对)。 - 将这个列表转换为
JavaPairRDD<String, Object>
(这是Apache Spark的一个分布式数据集类型) - 使用
originRDD.collectAsMap()
将RDD收集回一个映射。 - 将这个映射添加到
result2
列表中
- 创建一个新的列表
- 返回响应:
- 使用
R.ok().put("data", result2)
返回一个响应对象,其中data
字段包含了经过处理的result2
列表。但由于前面的处理存在逻辑问题,result2
中的每个元素都是一个只包含一行数据的映射,这显然不是预期的结果。
- 使用