将 SQL 查询转换为 Elasticsearch dsl 以进行数据可视化
Posted
技术标签:
【中文标题】将 SQL 查询转换为 Elasticsearch dsl 以进行数据可视化【英文标题】:Convert SQL query to Elasticsearch dsl for data visualization 【发布时间】:2022-01-23 21:01:29 【问题描述】:目前我在 Elasticsearch 中使用 SQL 查询,但由于一些数据问题想将它们转换为 Elasticsearch DSL。
我当前的sql查询是
"query": "select \"A\",\"B\" from \"sometable\" ORDER BY datetime DESC LIMIT 10"
返回这些结果:
"columns": [
"name": "A",
"type": "float"
,
"name": "B",
"type": "float"
],
"rows": [
[
81.22833251953125,
22.495885848999023
],
[
81.22833251953125,
22.495885848999023
]
]
但我希望以这种格式 [[x,y],[x,y]] 使用 Elasticsearch DSL 获得相同的结果。我也尝试将相同的 SQL 查询转换为 Elasticsearch DSL,但它返回不同的结果。
到目前为止我创建的 DSL 查询如下,但我们如何限制记录,例如 100。
"aggs":
"documentCounts":
"scripted_metric":
"init_script": "state.transactions = []",
"map_script": "state.transactions.add( [doc['A'].value,doc['B'].value] )",
"combine_script": " return state.transactions"
【问题讨论】:
【参考方案1】:您可以使用提供 ElasticSearch 适配器的Apache Calcite。
在文档中,您有一个关于如何使用 CSV 适配器的示例:https://calcite.apache.org/docs/tutorial.html,您可以轻松更改设置文件以实现 ES 相同。
此时你可以使用sqlline
通过SQL语句查询ES,Calcite会翻译成ES QL,并获取结果。
为了打印发送到 ES 的查询,只需将类 ElasticsearchTable
的日志级别更改为 DEBUG,例如使用此 log4j.properties
文件:
# Set root logger level to DEBUG and its only appender to A1.
log4j.category.org.apache.calcite.adapter.elasticsearch.ElasticsearchTable=DEBUG, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
那么你可以在sqlline
脚本中指向这个log4j属性文件,如下:
export JAVA_OPTS="-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl -Dlog4j.configuration=file://$YOUR_PATH/log4j.properties"
现在只需通过 sqlline 运行您的 select 语句,并在控制台中检查以 Elasticsearch Query:
开头的调试字符串。
这是我得到的输出示例:
$ ./sqlline
Building Apache Calcite 1.30.0-SNAPSHOT
sqlline version 1.12.0
sqlline> !connect jdbc:calcite:model=model.json admin admin
log4j:WARN No appenders could be found for logger (org.apache.calcite.adapter.elasticsearch.ElasticsearchSchemaFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Transaction isolation level TRANSACTION_REPEATABLE_READ is not supported. Default (TRANSACTION_NONE) will be used instead.
0: jdbc:calcite:model=model.json> select * from "zips";
3576 [main] DEBUG org.apache.calcite.adapter.elasticsearch.ElasticsearchTable - Elasticsearch Query: "size":5196
+----------------------------------------------------------------------------------+
| _MAP |
+----------------------------------------------------------------------------------+
| id=01701, city=FRAMINGHAM, loc=[-71.425486, 42.300665], pop=65046, state=MA |
| id=02154, city=NORTH WALTHAM, loc=[-71.236497, 42.382492], pop=57871, state=MA |
+----------------------------------------------------------------------------------+
2 rows selected (0.974 seconds)
【讨论】:
感谢亚历山德罗的回复,我会检查一下。 嗨 Alessandro,我已经设置了 Apache Calcite 并运行了查询,它显示了所需的结果,但是我在哪里可以看到翻译后的 SQL 查询? 您是通过编程方式还是通过 sqlline 运行它?如果是前者,您可以在某处分享您的代码 sn-p 吗? 我已经使用 sqline 运行过。 嗨亚历山德罗感谢您的评论。我会尝试并告诉你。谢谢以上是关于将 SQL 查询转换为 Elasticsearch dsl 以进行数据可视化的主要内容,如果未能解决你的问题,请参考以下文章
2021年大数据ELK(十六):Elasticsearch SQL(职位查询案例)
ElasticSearch 将嵌套字段的 Rest 查询转换为客户端 Scala/Java 代码