Presto 中的行类型支持

RowType support in Presto

向了解 Presto API 插件的人提问。

我实现了 BigQuery 插件。 BigQuery 支持 struct 类型,在 Presto 中可以表示为 RowType class。

RowTypeRowType::createBlockBuilder 中创建 RowBlockBuilder,它有 RowBlockBuilder::appendStructure 方法,只需要接受 AbstractSingleRowBlock class 的实例。

这意味着在我实施 Presto 的 RecordCursor BigQueryRecordCursor::getObject 方法时,我必须 return 某些 AbstractSingleRowBlock 类型的字段 RowType .

但是AbstractSingleRowBlock有包私有抽象方法,这使我无法实现这个class。唯一的 child SingleRowBlock 有 package private constructor,没有工厂或建造者可以为我建造一个实例。

如何在 BigQueryRecordCursor::getObject 中实现 struct 支持? (提醒:BigQueryRecordCursorRecordCursor 的 child)。

您需要通过调用 beginBlockEntry assemble 行的块,通过 Type.writeXXX 为每列附加值和列的类型,然后 closeEntry。这是一些伪代码。

BlockBuilder builder = type.createBlockBuilder(..);

builder = builder.beginBlockEntry();
for each column {
    ...

    columnType.writeXXX(builder, ...);
}
builder.closeEntry();

return (Block) type.getObject(builder, 0);

但是,我建议您改用柱状 API(即 ConnectorPageSource 和朋友)。看看Elasticsearch connector是如何实现的:

https://github.com/prestosql/presto/blob/master/presto-elasticsearch/src/main/java/io/prestosql/elasticsearch/ElasticsearchPageSourceProvider.java https://github.com/prestosql/presto/blob/master/presto-elasticsearch/src/main/java/io/prestosql/elasticsearch/ElasticsearchPageSource.java

这是它处理行类型的方式:

https://github.com/prestosql/presto/blob/master/presto-elasticsearch/src/main/java/io/prestosql/elasticsearch/decoders/RowDecoder.java

此外,我建议您加入 Presto Community Slack 上的 #dev 频道,所有 Presto 开发人员都在这里闲逛。