【问题标题】:BigQuery, TableRow: access repeated records with java apiBigQuery、TableRow:使用 java api 访问重复记录
【发布时间】:2015-05-19 02:03:59
【问题描述】:
我正在通过 java API 和新服务 Dataflow 访问 BigQuery 数据。我希望 TableRow 类具有以下方法:
- 返回 TableCell 实例的列表(如果有重复的字段)
- 返回一个 TableRow 实例(在嵌套字段的情况下)
- 返回 TableRow 实例列表(在重复嵌套字段的情况下)
但我只找到了使用 get 方法访问 TableRow 实例的字段的示例代码,这不方便,因为输出是 Object 类的实例。
我目前看到的唯一解决方案是解析我从 get 方法获得的字符串并自己构建一个 TableRow 对象,但我想知道是否有人有更好的解决方案可以分享?
非常感谢。
【问题讨论】:
标签:
java
google-bigquery
google-cloud-dataflow
【解决方案1】:
我返回了RepeatedRecord,我使用以下方式访问:
TableRow atrs = (TableRow) row.get("sts");
List<String> atrValue = (List<String>) atrs.get("value");
if(atrValue.size()>0){
TableRow atrRow = new TableRow();
atrRow.set("id", "sts");
atrRow.set("value", atrValue.toArray());
if(atrs.get("sv") !=null){
List<Integer> atrSV = ((List<String>) atrs.get("sv"))
.stream()
.map(x -> Integer.parseInt(x))
.collect(Collectors.toList());
atrRow.set("sv", atrSV.toArray());
}
else
atrRow.set("sv", null);
atrList.add(atrRow);
}
【解决方案2】:
最后我得出了这些结论:
- 如果根据您的架构,您期望重复字段,则应用于 TableRow 实例的 get 方法将返回一个 ArrayList 实例。
- 如果根据您的架构您期望记录,则应用于 TableRow 实例的 get 方法将返回 LinkedHashMap 的实例。
- 正如您所猜测的,如果根据您的架构您期望记录的重复字段,则应用于 TableRow 实例的 get 方法将返回一个 ArrayList 实例。
因此,您只需使用上述类之一将应用到 TableRow 实例的 get 方法的结果向下转换,然后您就可以充分利用它们的功能(例如,按名称进行迭代和调用)。
【解决方案3】:
TableRow 有一个getClassInfo() 方法。它有什么帮助吗? (我自己没有尝试过使用嵌套字段)