将 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 以进行数据可视化的主要内容,如果未能解决你的问题,请参考以下文章

从SQL转换为elasticsearch查询

2021年大数据ELK(十六):Elasticsearch SQL(职位查询案例)

ElasticSearch 将嵌套字段的 Rest 查询转换为客户端 Scala/Java 代码

将 SQL 查询转换为 SQL 函数?

Elasticsearch SQL查询 --- 2022-04-03

将 SQL 查询转换为 Hibernate 查询