用于读取记录数组的BigQuery Java API:“不支持按名称检索字段值”异常

时间:2018-01-18 11:41:02

标签: google-bigquery

我在BigQuery中的当前表有一个使用复杂类型的列。 “family”列实际上是记录的列表(“重复”功能)(包含2个字段:id& name)。

当我尝试使用以下语法获取1行的第一个“id”值时:

FieldValueList c = qr.getValues().iterator().next();    
c.get("family").getRepeatedValue().get(0).getRecordValue().get("id");

我得到例外:

Method threw 'java.lang.UnsupportedOperationException' exception.
Retrieving field value by name is not supported when there is no fields schema provided

这有点烦人,因为我的表有一个明确定义的架构。当我使用相同的Java调用执行“读取”查询时,我也可以看到正确找到了这个模式:

qr.getSchema().getFields().get("family").getSubFields().toString();
-->
[Field{name=id, type=INTEGER, mode=NULLABLE, description=null}, Field{name=name, type=STRING, mode=NULLABLE, description=null}]

由于这个例外,我找到的解决方法是传递记录字段的“索引”而不是给它命名

c.get("family").getRepeatedValue().get(0).getRecordValue().get(0).getLongValue();

然而,这要求传递索引而不是名称。

有没有更好的方法来获取数组中记录中字段的值(如果我的列只是一个记录,没有数组,那么我没有得到异常)?

这个例外是否正常?

1 个答案:

答案 0 :(得分:1)

您可以使用“ of”静态方法将未命名的FieldValueList包裹成一个已命名的字段:

FieldList subSchema = qr.getSchema().getFields().get("family").getSubFields();
FieldValueList c = qr.getValues().iterator().next();
FieldValueList.of(
  c.get("family").getRepeatedValue().get(0).getRecordValue(),
  subSchema).get("id");

“ of”方法采用一个FieldValueList(在这种情况下由getRecordValue()返回)和一个FieldList(在此为子模式),并返回相同的FieldValueList,但具有命名访问权限。