【发布时间】:2017-10-30 17:45:32
【问题描述】:
我们正在使用 H2O 3.10.4.7 开发 Java 程序,我们需要检索有关框架中所有列的元数据,例如列名和数据类型。相关问题(未解决,不同问题)here.
我们的期望是 water.bindings.H2oApi 客户端就像 REST 端点一样工作,我们希望使用 Javadoc 中描述的 H2oApi 方法 frameColumns(FrameKeyV3 frameId):
“返回一个框架中的所有列。”
但结果不包含任何与列相关的信息。 当我们通过浏览器使用 REST 端点时,我们会像预期的那样获得有关框架中列的详细信息。例子:
H2oApi:
FramesV3 params = new FramesV3();
params.frameId = stringToKey(frame, FrameKeyV3.class); // "frame" reference from import process, works
// try with frameColumns()
FramesV3 frameColumns = api.frameColumns(params);
System.out.println(frameColumns.toString()); // "columns" not included in JSON response
结果:
{
"column":"",
"row_offset":0,
"row_count":0,
"column_offset":0,
"column_count":0,
"find_compatible_models":false,
"path":"",
"force":false,
"num_parts":1,
"frames":[
{
"frame_id":{
"name":"3d257aae-7266-48a1-8f35-1243436616ab",
"type":"Key\u003cFrame\u003e",
"URL":"/3/Frames/3d257aae-7266-48a1-8f35-1243436616ab"
},
"byte_size":1928,
"is_text":false,
"_exclude_fields":""
}
],
"_exclude_fields":""
}
REST 端点:
http://localhost:54321/3/Frames/3d257aae-7266-48a1-8f35-1243436616ab/columns
结果:
{
"__meta": {
"schema_version": 3,
"schema_name": "FramesV3",
"schema_type": "Frames"
},
"_exclude_fields": "",
"row_offset": 0,
"row_count": 0,
"column_offset": 0,
"column_count": 0,
"job": null,
"frames": [
{
"__meta": {
"schema_version": 3,
"schema_name": "FrameV3",
"schema_type": "Frame"
},
"_exclude_fields": "",
"frame_id": {
"__meta": {
"schema_version": 3,
"schema_name": "FrameKeyV3",
"schema_type": "Key<Frame>"
},
"name": "3d257aae-7266-48a1-8f35-1243436616ab",
"type": "Key<Frame>",
"URL": "/3/Frames/3d257aae-7266-48a1-8f35-1243436616ab"
},
"byte_size": 1928,
"is_text": false,
"row_offset": 0,
"row_count": 100,
"column_offset": 0,
"column_count": 5,
"total_column_count": 5,
"checksum": -7731554748204616990,
"rows": 150,
"num_columns": 5,
"default_percentiles": [
0.001,
0.01,
0.1,
0.2,
0.25,
0.3,
0.3333333333333333,
0.4,
0.5,
0.6,
0.6666666666666666,
0.7,
0.75,
0.8,
0.9,
0.99,
0.999
],
"columns": [
{
"__meta": {
"schema_version": 3,
"schema_name": "ColV3",
"schema_type": "Vec"
},
"label": "sepal_length",
"missing_count": 0,
"zero_count": 0,
"positive_infinity_count": 0,
"negative_infinity_count": 0,
"mins": [
4.3,
4.4,
4.4,
4.4,
4.5
],
"maxs": [
7.9,
7.7,
7.7,
7.7,
7.7
],
"mean": 5.843333333333334,
"sigma": 0.8280661279778637,
"type": "real",
"domain": null,
"domain_cardinality": 0,
"data": [ ... ]
"string_data": null,
"precision": 1,
"histogram_bins": null,
"histogram_base": 0.0,
"histogram_stride": 0.0,?
"percentiles": null
...
}
我们对 JSON 实体“列”感兴趣以检索我们需要的元数据,但 H2o Java Api 不提供它。
最好的问候!
尼哥
【问题讨论】:
-
这可能是我们
toString中的一个“错误”,您可以试试((FrameV3)(frameColumns.frames[0])).columns[0].label吗? -
我试过
FramesV3 frameColumns = api.frameColumns(params); System.out.println(((FrameV3)(frameColumns.frames[0])).columns[0].label);导致这个异常:java.lang.AssertionError: water.bindings.pojos.FrameBaseV3 cannot be cast to water.bindings.pojos.FrameV3 -
这是有道理的,因为
water.bindings.pojos.FrameV3扩展了water.bindings.pojos.FrameBaseV3而不是相反。FrameBaseV3似乎在water.bindings.pojos.FramesV3中被 Retrofit 用于对象映射,并且不包含列。所以我猜只要H2oApi方法返回water.bindings.pojos.FramesV3类型的对象和water.bindings.pojos.FrameBaseV3数组作为Frame 引用,列将永远不会包含在结果中。 -
yes
FrameV3extendsFrameBaseV3这就是为什么你可以做FrameBaseV3 x = new FrameV3()但是如果你想从FrameV3类中获取字段,你需要强制转换并且如果底层对象确实是它应该工作FrameV3。在这种情况下,就像您说的那样,Retrofit 似乎将FrameBaseV3的实例放入了frames变量中,这就是强制转换失败的原因。在后端,我们正在正确设置它(这就是您通过 curl 获得正确响应的原因)。猜猜这是一个错误,你应该在我们的 JIRA 上打开一个问题。真的很高兴有人开始使用 Java API :-)