我是方解石的新手。它提供的功能看起来很棒!
在进行研究时,我试图通过示例 ElasticSearch适配器来弄清楚如何进行一些基本的SQL查询。
在AbstractElasticsearchTable.getRowType
中,它将行映射到MAP。
问题是:
查询:
select * from zips where \"city\" = 'BROOKLYN'
返回:
city=BROOKLYN; longitude=-73.956985; latitude=40.646694; pop=111396; state=NY; id=11226
查询:
select \"pop\" from zips where \"city\" = 'BROOKLYN'
返回:
pop={pop=111396}
我的目标是总结所有“流行”值。
所以当我构造这样的查询时:
select sum(\"pop\") from zips where \"city\" = 'BROOKLYN'
错误是:
Caused by: java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to java.lang.Integer at Baz$2.apply(Unknown Source) at Baz$2.apply(Unknown Source) at org.apache.calcite.linq4j.EnumerableDefaults.aggregate(EnumerableDefaults.java:117) at org.apache.calcite.linq4j.DefaultEnumerable.aggregate(DefaultEnumerable.java:107) at Baz.bind(Unknown Source) at org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enumerable(CalcitePrepare.java:356)
有人可以指出我正确的方向,以弄清楚如何使用示例中的映射进行聚合吗?
要执行此查询,我在ElasticSearchAdapterTest.java
中添加了一个测试。
@Test
public void select() {
CalciteAssert.that().with(newConnectionFactory())
.query("select sum(\"pop\") from zips where \"city\" = 'BROOKLYN'").returns("");
}
答案 0 :(得分:0)
将RowType实施为StructType解决了我的问题。在这里:
public RelDataType getRowType(RelDataTypeFactory typeFactory) {
try {
Map<String, String> mapping = getMapping();
List<RelDataType> types = new ArrayList<RelDataType>();
List<String> names = new ArrayList<>();
for(Map.Entry<String, String> e : mapping.entrySet()) {
names.add(e.getKey());
types.add(translateEsType(e.getValue(), typeFactory));
}
return typeFactory.createStructType(types, names);
} catch(IOException e) {
throw new RuntimeException(e.getMessage(), e);
}
}