实木复合地板:递归节俭数据结构

时间:2016-02-29 14:55:01

标签: java recursion thrift parquet

我有以下(简化的)thrift定义。它包含一个递归的树状结构:

namespace java com.test.thrift

struct B {
  1: list<A> aList,
  2: i16 label
}

struct A {
  1: list<B> bList,
  2: i16 label
}

转换此定义的Java表示形式会导致堆栈溢出(无限循环)

val sType = org.apache.parquet.thrift.ThriftSchemaConverter.toStructType(classOf[com.test.thrift.A])

通过创建

的实例来调用
org.apache.parquet.thrift.ThriftParquetWriter

递归是关于:

at org.apache.parquet.thrift.ThriftSchemaConverter.toStructType(ThriftSchemaConverter.java:82)
at org.apache.parquet.thrift.ThriftSchemaConverter.toThriftField(ThriftSchemaConverter.java:116)
at org.apache.parquet.thrift.ThriftSchemaConverter.toThriftField(ThriftSchemaConverter.java:131)

有没有办法在Parquet中使用递归数据结构?

感谢您的支持

1 个答案:

答案 0 :(得分:0)

你可能有一个引用循环,这就是引导你进入堆栈溢出异常的原因(序列化程序会在事情爆炸之前跟踪引用)。

避免遇到此问题的可能解决方案可能是为每个标签添加标识符字段,并在 currScenario = mainTable.getElementsByName("acq_scenario.acq_scenario_summary").Item(0).getElementsByTagName("tr").Item(1).getElementsByTagName("td").Item(2).realValue 'gets string value for "Current Scenario" field, which I've unsuccessfully tried to use to manually update the "selected" attribute in the table mainTable.getElementsByName("acq_scenario.acq_scenario_summary").Item(0).setAttribute "selected", "ScenarioName=" & currScenario mainTable.getElementsByName("acq_scenario.acq_scenario_summary").Item(0).getElementsByTagName("tr").Item(0).setAttribute "class", "Skin_Selection_Color" mainTable.getElementsByName("acq_scenario.acq_scenario_summary").Item(0).getElementsByTagName("tr").Item(0).style.setAttribute "highlight", "true" aList中使用这些字段而不是参考。