我在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();
然而,这要求传递索引而不是名称。
有没有更好的方法来获取数组中记录中字段的值(如果我的列只是一个记录,没有数组,那么我没有得到异常)?
这个例外是否正常?
答案 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,但具有命名访问权限。