4

我正在通过 java API 和新服务 Dataflow 访问 BigQuery 数据。我希望 TableRow 类具有以下方法:

  • 返回 TableCell 实例的列表(在重复字段的情况下)
  • 返回一个 TableRow 实例(在嵌套字段的情况下)
  • 返回 TableRow 实例的列表(在重复嵌套字段的情况下)

但是我只找到了使用 get 方法访问 TableRow 实例的字段的示例代码,这并不方便,因为输出是 Object 类的实例。

目前我看到的唯一解决方案是解析我从 get 方法获得的字符串并自己构建一个 TableRow 对象,但我想知道是否有人有更好的解决方案可以分享?

非常感谢。

4

3 回答 3

3

最后我得出以下结论:

  • 如果根据您的架构,您期望一个重复的字段,则应用于您的 TableRow 实例的 get 方法将返回一个 ArrayList 实例。
  • 如果根据您的模式,您期望记录,则应用于 TableRow 实例的 get 方法将返回 LinkedHashMap 的实例。
  • 正如您已经猜到的,如果根据您的架构您期望记录的重复字段,则应用于 TableRow 实例的 get 方法将返回 ArrayList 的实例。

因此,您只需使用上述类之一将应用到 TableRow 实例的 get 方法的结果向下转换,然后您就可以充分利用它们的功能(例如,按名称迭代和调用)。

于 2015-03-18T18:23:03.240 回答
2

Repeated Record被退回了,我使用以下方式访问:

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);
                }
于 2017-03-25T03:57:07.063 回答
0

TableRow has a getClassInfo() method. Does it help in any way? (haven't tried working with nested fields myself)

于 2015-03-16T21:20:25.123 回答