Java API 如何将带有 array vector 类型的 BasicTable 对象转为 MultiThreadedTableWriter::insert 能接受的格式?

例如 如果 BasicTable 对象 data 包含 double array vector 列

使用以下 Java 代码会报错 : 


java.lang.RuntimeException: Failed to insert data. Cannot convert Entity to DT_DOUBLE_ARRAY.
at com.xxdb.data.BasicEntityFactory.createScalar


BasicTable data;
MultithreadedTableWriter mtwWriter = new MultithreadedTableWriter(/*...... params*/);
for (int rowIdx = 0; rowIdx < data.rows(); rowIdx++) {
List<Object> row = new ArrayList<>();
for (int k = 0; k < data.columns(); k++) {
Vector col = data.getColumn(k);
row.add(col.get(rowIdx));
}
mtwWriter.insert(row.toArray());
}
请先 登录 后评论

1 个回答

chris

需要分三步

1 先将 列转化为 BasicArrayVector 

2 然后调用 getVectorValue 取得该列第 rowIdx 行的数据

3 . 再转换 Entity[]

才能转换为 MultithreadedTableWriter::insert 能识别的格式

    for (int rowIdx = 0; rowIdx < data.rows(); rowIdx++) {
      List<Object> row = new ArrayList<>();
      for (int k = 0; k < data.columns(); k++) {
        Vector col = data.getColumn(k);
        if (col instanceof BasicArrayVector){
          Vector vecVal = ((BasicArrayVector)col).getVectorValue(rowIdx);
          Entity[] vecValRes = new Entity[vecVal.rows()];
          for (int vecValidx = 0; vecValidx < vecVal.rows(); vecValidx++) {
            vecValRes[vecValidx] = vecVal.get(vecValidx);
          }
          row.add(vecValRes);
        } else {
          row.add(col.get(rowIdx));
        }
      }
    mtwWriter.insert(row.toArray());
 }
请先 登录 后评论