【问题标题】:Convert SQL query to Elasticsearch dsl for data visualization将 SQL 查询转换为 Elasticsearch dsl 以进行数据可视化
【发布时间】: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"
          }
       }
    }
}

【问题讨论】:

    标签: sql elasticsearch


    【解决方案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 运行过。
    • 嗨亚历山德罗感谢您的评论。我会尝试并告诉你。谢谢
    猜你喜欢
    • 2019-11-22
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多