BigQuery,TableRow:使用java api访问重复记录

时间:2015-03-16 19:44:40

标签: java google-bigquery google-cloud-dataflow

我通过java API和新服务Dataflow访问BigQuery数据。我原以为TableRow类有以下方法:

  • 返回TableCell实例列表(如果是重复字段)
  • 返回TableRow实例(如果是嵌套字段)
  • 返回TableRow实例列表(如果是重复的嵌套字段)

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

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

非常感谢。

3 个答案:

答案 0 :(得分:2)

最后我得出了这些结论:

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

所以你只需要使用上面一个类中的应用于TableRow实例的get方法向下转换结果,然后你可以充分利用它们的功能(例如迭代和调用名称)。

答案 1 :(得分:1)

我已退回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);
                }

答案 2 :(得分:0)

TableRow有一个getClassInfo()方法。它有什么用? (我自己尝试使用嵌套字段)