高性能实时分析数据库:Apache Druid 查询数据 Query data

文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。

Apache Druid
Druid 是一款高性能实时分析数据库,主要价值在于缩短洞察和行动的时间。Druid 专为需要快速查询和数据采集的工作流而设计。Druid 擅长于支持 UI、运行操作型(即席)查询或处理高并发性。您可以将 Druid 视为适用于各种用例的数据仓库的开源替代方案。

查询数据

Query data

本教程演示如何使用 SQL 查询 Apache Druid 中的数据。

它假设你已经完成 Quickstart 或以下某个教程,因为我们将查询你在跟随其中一个教程时创建的 datasource:

运行 Druid SQL 查询有多种方式:通过 web console、使用命令行工具以及通过 HTTP 提交查询。我们将逐一介绍。

从 web console 查询 SQL

web console 包含一个视图,可帮助你更轻松地构建和测试查询,并查看其结果。

  1. 启动 Druid 集群(如果尚未运行),然后在浏览器中打开 web console。

  2. 点击标题栏中的 Query 以打开 Query 视图:
    在这里插入图片描述
    你可以始终在编辑窗格中直接编写查询,但 Query 视图也提供了帮助你构造 SQL 查询的功能,我们将使用它来生成一个起始查询。

  3. 在左窗格中展开 wikipedia datasource 树。我们将为 page 维度创建查询。

  4. 点击 page,然后从菜单中选择 Show:page
    在这里插入图片描述
    一个 SELECT 查询会出现在查询编辑窗格中并立即运行。然而,在这种情况下,查询未返回数据,因为默认情况下查询过滤最近一天的数据,而我们的数据远早于该时间。让我们移除该过滤条件。

  5. 点击 Run 运行查询。

    你现在应该看到两列数据:页面名称和计数:
    在这里插入图片描述
    注意,结果默认在 console 中限制为大约一百行,这是由于 Smart query limit 功能。这有助于用户避免意外运行返回过多数据的查询,可能使系统不堪重负。

  6. 让我们直接编辑查询,并在编辑器中查看更多查询构建功能。点击查询编辑窗格并进行以下更改:

    1. 在第一列 "page" 后添加一行,开始输入新列名 "countryName"。注意,自动补全菜单会建议列名、函数、关键字等。选择 “countryName”,并将其添加到 GROUP BY 子句中,可以通过名称或通过其位置引用 2

    2. 为了可读性,将 Count 列名替换为 Edits,因为 COUNT() 函数实际返回的是该页面的编辑次数。在 ORDER BY 子句中也做同样的列名更改。

      COUNT() 函数是 Druid SQL 查询中可用的众多函数之一。你可以将鼠标悬停在自动补全菜单中的函数名称上,查看函数的简要描述。此外,你可以在 Druid 文档中找到更多信息;例如,COUNT() 函数记录在 Aggregation functions 中。

    查询现在应为:

    SELECT
      "page",
      "countryName",
      COUNT(*) AS "Edits"
    FROM "wikipedia"
    GROUP BY 1, 2
    ORDER BY "Edits" DESC
    

    当你再次运行查询时,注意到我们获得了新的维度 countryName,但对于大多数行,其值为 null。让我们仅显示具有 countryName 值的行。

  7. 点击左窗格中的 countryName 维度,并选择第一个过滤选项。这不是我们想要的,但我们将手动编辑它。新的 WHERE 子句应出现在你的查询中。

  8. 修改 WHERE 子句以排除没有 countryName 值的结果:

    WHERE "countryName" IS NOT NULL
    

    再次运行查询。你现在应该看到按国家排序的顶部编辑:
    在这里插入图片描述

  9. 在底层,每个 Druid SQL 查询在运行前都会被翻译成基于 JSON 的 Druid native query 格式。你可以通过点击 ... 并选择 Explain SQL Query 来查看此查询的 native query。

    虽然你可以将 Druid SQL 用于大多数目的,但熟悉 native query 对于编写复杂查询和排查性能问题非常有用。更多信息请参见 Native queries
    在这里插入图片描述
    另一种查看解释计划的方法是在查询前添加 EXPLAIN PLAN FOR,如下所示:

EXPLAIN PLAN FOR
SELECT
  "page",
  "countryName",
  COUNT(*) AS "Edits"
FROM "wikipedia"
WHERE "countryName" IS NOT NULL
GROUP BY 1, 2
ORDER BY "Edits" DESC

这在通过命令行或 HTTP 运行查询时特别有用。

  1. 最后,点击 ... 并选择 Edit context 以查看如何添加控制查询执行的附加参数。在字段中,按 Context flags 所述,以 JSON 键值对形式输入查询上下文选项。

就是这样!我们使用 web console 内置的一些查询构建功能构建了一个简单查询。以下部分提供了更多可尝试的示例查询。

有关如何使用 Druid SQL HTTP API 的示例,请参见 Query SQL over HTTP

更多 Druid SQL 示例

尝试以下查询以了解更多 Druid SQL 技巧:

Query over time

SELECT FLOOR(__time to HOUR) AS HourTime, SUM(deleted) AS LinesDeleted
FROM wikipedia WHERE TIME_IN_INTERVAL("__time", '2016-06-27/2016-06-28')
GROUP BY 1

在这里插入图片描述

General group by

SELECT channel, page, SUM(added)
FROM wikipedia WHERE TIME_IN_INTERVAL("__time", '2016-06-27/2016-06-28')
GROUP BY channel, page
ORDER BY SUM(added) DESC

在这里插入图片描述

通过 HTTP 查询 SQL

你可以 直接通过 HTTP 向 Druid Broker 提交 native 查询。请求体应为 JSON 对象,其中键 query 的值为查询文本:

{
  "query": "SELECT page, COUNT(*) AS Edits FROM wikipedia WHERE TIME_IN_INTERVAL(\"__time\", '2016-06-27/2016-06-28') GROUP BY page ORDER BY Edits DESC LIMIT 10"
}

教程包中包含一个示例文件,位于 quickstart/tutorial/wikipedia-top-pages-sql.json,其中包含上述 SQL 查询。让我们将该查询提交给 Druid Broker:

curl -X 'POST' -H 'Content-Type:application/json' -d @quickstart/tutorial/wikipedia-top-pages-sql.json http://localhost:8888/druid/v2/sql

应返回以下结果:

[
    {
        "page": "Copa América Centenario",
        "Edits": 29
    },
    {
        "page": "User:Cyde/List of candidates for speedy deletion/Subpage",
        "Edits": 16
    },
    {
        "page": "Wikipedia:Administrators' noticeboard/Incidents",
        "Edits": 16
    },
    {
        "page": "2016 Wimbledon Championships – Men's Singles",
        "Edits": 15
    },
    {
        "page": "Wikipedia:Administrator intervention against vandalism",
        "Edits": 15
    },
    {
        "page": "Wikipedia:Vandalismusmeldung",
        "Edits": 15
    },
    {
        "page": "The Winds of Winter (Game of Thrones)",
        "Edits": 12
    },
    {
        "page": "ولاية الجزائر",
        "Edits": 12
    },
    {
        "page": "Copa América",
        "Edits": 10
    },
    {
        "page": "Lionel Messi",
        "Edits": 10
    }
]

延伸阅读

有关使用 Druid SQL 查询的更多信息,请参见 Druid SQL documentation

有关 Druid native 查询的更多信息,请参见 Queries documentation

风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。

<think>好的,我现在要解决用户遇到的ShardingSphere配置中因JDBC驱动问题导致的报错,具体错误是“Failed to get driver instance for jdbcUrl=jdbc:xugu”。用户已经提供了相关的引用信息,我需要结合这些信息来分析问题并给出解决方案。 首先,我需要了解这个错误通常是什么原因引起的。根据引用中的信息,类似的问题比如MySQL驱动加载失败,通常是因为驱动类没有正确配置或者驱动包未加入项目依赖。例如引用[3]中提到,如果驱动类名配置不正确或者驱动包缺失,就会出现类似错误。用户现在使用的是虚谷数据库(Xugu),对应的JDBC驱动类应该是com.xugu.cloudjdbc.Driver,但错误提示显示驱动实例获取失败,可能是驱动类名不正确或者驱动包未正确加载。 接下来,我需要检查用户的配置是否正确。用户提供的引用[4]中虚谷数据库的JDBC连接字符串是jdbc:xugu://192.168.1.201:5138/SYSTEM,而驱动类可能应该是com.xugu.cloudjdbc.Driver或者其他类似的名字。但用户的错误信息显示配置的驱动类可能不正确,或者驱动包没有正确引入。 然后,我需要确认用户是否在项目中正确添加了虚谷数据库的JDBC驱动包。根据引用[5],当出现类似驱动类找不到的问题时,通常需要将对应的JAR包添加到项目的依赖中。比如MySQL需要添加mysql-connector-java.jar,同理,虚谷数据库也需要对应的驱动JAR包。用户是否已经下载了Xugu的JDBC驱动,并在项目中引入?如果没有,需要指导用户下载并添加。 另外,检查驱动类名是否正确。引用[3]中提到的MySQL驱动类名为com.mysql.cj.jdbc.Driver,而引用[4]中的Xugu连接示例可能使用的驱动类是com.xugu.cloudjdbc.Driver。用户可能在配置中写错了驱动类名,例如拼写错误或者使用了过期的类名,这会导致驱动加载失败。 还有,查看ShardingSphere的配置文件中是否正确指定了驱动类名和JDBC URL。例如,在Spring Boot的application.properties或application.yml中,需要正确设置spring.datasource.driver-class-name和spring.datasource.url。确保这些配置与虚谷数据库的要求一致。 最后,可能需要检查类加载器是否能找到驱动类。有时候即使JAR包已经添加,如果模块依赖配置不正确,或者构建工具(如Maven/Gradle)未正确引入依赖,也会导致类加载失败。用户需要确认驱动包是否被正确打包到项目中,并且在运行时可用。 总结下来,解决步骤可能是:1.确认驱动类名正确;2.添加驱动JAR包到项目依赖;3.检查配置文件中的JDBC URL和驱动类配置是否正确;4.确保项目构建配置正确,驱动包被正确引入。</think>针对ShardingSphere配置虚谷数据库(Xugu)时出现的`Failed to get driver instance for jdbcUrl=jdbc:xugu`错误,以下是逐步解决方案: --- ### 1. **确认JDBC驱动类名正确性** 虚谷数据库的JDBC驱动类名通常为 **`com.xugu.cloudjdbc.Driver`**(具体以官方文档为准)。在Spring或ShardingSphere配置文件中需明确指定: ```properties # 示例配置(application.properties) spring.datasource.driver-class-name=com.xugu.cloudjdbc.Driver spring.datasource.url=jdbc:xugu://192.168.1.201:5138/SYSTEM?user=SYSDBA&password=SYSDBA ``` 若类名拼写错误(如大小写不一致或包路径错误),会导致驱动加载失败[^4]。 --- ### 2. **添加虚谷JDBC驱动依赖** 虚谷数据库的驱动需手动下载并添加到项目中: - **步骤1**:从[虚谷数据库官网](https://www.xugudb.com)下载`xugu-jdbc-driver.jar`。 - **步骤2**:将JAR包放入项目的`libs`目录,并通过IDE(如IntelliJ IDEA)将其添加为库依赖: - 右键JAR文件 → **Add As Library** → 选择模块作用范围[^5]。 - **步骤3**:若使用Maven/Gradle,需通过本地依赖引入(示例为Maven): ```xml <dependency> <groupId>com.xugu</groupId> <artifactId>xugu-jdbc</artifactId> <version>驱动版本号</version> <scope>system</scope> <systemPath>${project.basedir}/libs/xugu-jdbc-driver.jar</systemPath> </dependency> ``` --- ### 3. **检查JDBC URL格式** 虚谷数据库的JDBC URL格式应为: `jdbc:xugu://<IP地址>:<端口>/<数据库名>?user=<用户名>&password=<密码>` 确保URL中参数正确,如端口号是否为默认的`5138`,以及用户名/密码是否有特殊字符需转码[^4]。 --- ### 4. **验证类加载路径** 若驱动已添加但依然报错,检查以下内容: - **运行时依赖**:通过`mvn dependency:tree`(Maven)或`gradle dependencies`(Gradle)确认驱动包是否被正确打包。 - **类加载隔离**:在Tomcat或Spring Boot中,确保驱动包位于应用类加载器的扫描路径下。 --- ### 5. **调试驱动加载过程** 在代码中添加调试语句,验证驱动是否被加载: ```java public class DriverCheck { public static void main(String[] args) { try { Class.forName("com.xugu.cloudjdbc.Driver"); System.out.println("驱动加载成功"); } catch (ClassNotFoundException e) { System.out.println("驱动未找到"); } } } ``` 若输出“驱动未找到”,则需重新检查依赖配置。 --- ### 6. **参考其他数据库驱动配置** 类比MySQL驱动的配置(如引用[3]),虚谷数据库的配置逻辑一致: ```properties # MySQL示例(对比) spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/dbname ``` 需确保虚谷的驱动类名和URL遵循其官方规范。 --- ### 总结流程图 ```mermaid graph TD A[报错: Failed to get driver instance] --> B{驱动类名是否正确?} B -->|是| C{驱动包是否引入?} B -->|否| D[修正类名并重试] C -->|是| E{JDBC URL格式正确?} C -->|否| F[添加驱动包到依赖] E -->|是| G[检查类加载路径] E -->|否| H[修正URL格式] G --> I[验证成功] ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

船长Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值