我收到一个List<org.apache.avro.generic.GenericRecord>
,其数据内容如下所示(为清晰起见,使用了JSON表示法)。如何使用Java最好地保存这些记录类型?
记录1:
[
{
"serial_no" : "x",
"data1" : "d"
},
{
"serial_no" : "y",
"data2" : "d2"
},
............................MANY MORE
]
记录2:
[
{
"id":"x",
"type":"A"
},
{
"id" : "x",
"type" : "B"
},
{
"id" : "y",
"type" : "A",
},
{
"id" : "y",
"type" : "B"
}
]
如您所见,每个serial number
在record2中有两条记录。记录1中的serial_no
与记录2中的id
相同。
我的目标是: 最难找到这两条记录的方式。
解决方案我认为:
创建一个类似
的地图 map.put("x", [map.put("A",List), map.put("B",List)]);
但我觉得,它是一个复杂的结构。因为地图包含地图列表[each map is Map<String,List<Map<String,String>>>]
。
有什么建议吗?
修改
记录中的每个条目都是avro GenericRecord
答案 0 :(得分:4)
看起来好像是在尝试使用Java解析JSON。为什么不使用特定的库? 与基本的http://www.json.org/java/或Google的https://github.com/google/gson
相同否则,我不认为你提出的复杂结构特别慢。如果您认为更有效或更容易获取数据,您可能希望设计自己的对象类来保存数据。
修改强>
基于您的问题,我认为JSON是您收到的格式,抱歉。
我只是为GenericRecord创建一个包装器,或者将它子类化。然后添加提取数据所需的方法,或将其Comparable
进行排序。
的内容
public class MyRecord extends GenericRecord implements Comparable<MyRecord>
{
// Determine the type
public int getType()
{
if ( this.get( "id") != null )
return 2;
return 1;
}
// Add methods that allow you to retrieve the serial field from any of the two record types
public String getId()
{
if ( this.get( "id") != null )
return (String)this.get("id");
return (String)this.get("serial_no");
}
// add comparator methods that will allow you to sort the list, compare based on Id, etc
@Override
public int compareTo(MyRecord another)
{
// Just a simple example
return this.getId().compareTo( another.getId() );
}
}
答案 1 :(得分:1)
为重复输入定义class
es:
class SerialNoData {
String serialNo;
Object data;
}
和
class IdType {
String id;
String type;
}
解析后,将实例放入数组或List
以获得所需的格式。
答案 2 :(得分:0)
地图的复杂程度并没有真正对速度产生影响。根据您使用的Map类型,获取记录列表将是恒定时间(具有相当小的开销)。在子列表中查找内容将为O(n),因为您需要遍历列表并查看所有地图。
答案 3 :(得分:0)
定义以下类
class Serial{
String serial-no;
String data;
List<IdType> idTypes;
}
class IdType{
String id;
String type;
}
之后,您可以使用jackson或任何类型的JSON处理库。