From e44d26d44857db52ffdc77824b8853906826c3bb Mon Sep 17 00:00:00 2001 From: Wade Zhang Date: Mon, 11 Dec 2023 10:58:29 +0800 Subject: [PATCH] doc: odbc english version --- docs/en/08-client-libraries/50-odbc.mdx | 75 ++++++++++++++++++ .../assets/odbc-check-data.webp | Bin 0 -> 35394 bytes .../assets/odbc-native-config-zh.webp | Bin 0 -> 6306 bytes .../assets/odbc-ws-config-zh.webp | Bin 0 -> 6234 bytes docs/en/20-third-party/75-powerbi.md | 65 +++++++++++++++ docs/zh/08-connector/50-odbc.mdx | 15 ++-- 6 files changed, 148 insertions(+), 7 deletions(-) create mode 100644 docs/en/08-client-libraries/50-odbc.mdx create mode 100644 docs/en/08-client-libraries/assets/odbc-check-data.webp create mode 100644 docs/en/08-client-libraries/assets/odbc-native-config-zh.webp create mode 100644 docs/en/08-client-libraries/assets/odbc-ws-config-zh.webp create mode 100644 docs/en/20-third-party/75-powerbi.md diff --git a/docs/en/08-client-libraries/50-odbc.mdx b/docs/en/08-client-libraries/50-odbc.mdx new file mode 100644 index 0000000000..cf19d1136e --- /dev/null +++ b/docs/en/08-client-libraries/50-odbc.mdx @@ -0,0 +1,75 @@ +--- +sidebar_label: ODBC +title: TDengine ODBC +--- + + +## Introduction + +TDengine ODBC driver is a driver specifically designed for TDengine based on the ODBC standard. It can be used by ODBC based applications on Windows to access a local or remote TDengine cluster or TDengine cloud service, like [PowerBI](https://powerbi.microsoft.com). + +TDengine ODBC provides two kinds of connections, native connection and WebSocket connection. You can choose to use either one for your convenience, WebSocket is recommded choice and you must use WebSocket if you are trying to access TDengine cloud service. + +Note: TDengine ODBC driver can only be run on 64-bit system, and can only be invoked by 64-bit applications. + + +## Install + +1. TDengine ODBC driver supports only Windows platform. To run on Windows, VisualStudio C Runtime library is required. If VisualStudio C Runtime Library is missing on your platform, you can download and install it from [VC Runtime Library](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170). + +2. Install TDengine client package for Windows, the version should be above 3.2.1.0, the client package includes both TDengine ODBC driver and some other necessary libraries that will be used in either native connection or WebSocket connection. + +## Configure Data Source + +### Connection Types + +TDengine ODBC driver supports two kinds of connections to TDengine cluster, native connection and WebSocket connection, here is the major differences between them. + +1. Only WebSocket can connect to TDengine cloud service. + +2. Websocket connection is more compatible with different TDengine server versions, normally you don't need to uupgrade client package with the server side. + +3. Native connection normally has better performance, but you need to keep the version aligned with the server side. + +4. For most users, it's recommended to use **WebSocket** connection, which has much better compatibility and almost same performance as native connection. + +### WebSocket Connection + +1. Click the "Start" Menu, and Search for "ODBC", and choose "ODBC Data Source (64-bit)" (Note: Don't choose 32-bit) + +2. Select "User DSN" tab, and click "Add" to enter the page for "Create Data Source" + +3. Choose the data source to be added, here we choose "TDengine" + +4. Click "Finish", and enter the configuration page for "TDengine ODBC Data Source", fill in required fields + + ![ODBC websocket connection config](./assets/odbc-ws-config-zh.webp) + + 4.1 [DSN]: Data Source Name, required field, to name the new ODBC data source + + 4.2 [Connection Type]: required field, we choose "WebSocket" + + 4.3 [URL]: required field, the URL for the ODBC data source, for example, `http://localhost:6041` is the URL for a local TDengine cluster, `https://gw.cloud.taosdata.com?token=your_token` is the URL for a TDengine cloud service. + + 4.4 [Database]: optional field, the default database to access + + 4.5 [User]: optional field, only used for connection testing in step 5; If it's left as blank, "root" user will be used by default. + + 4.6 [Password]: optional field, only used for connection testing in step 5; + +5. Click "Test Connecting" to test whether the data source can be connectted; if successful, it will prompt "connecting success" + +6. Click "OK" to sae the configuration and exit. + +7. You can also select an already configured data source name in step 2 to change existing configuration. + +### Native Connection + +Please be noted that native connection can't be used to access a TDengine client service. + +The steps are exactly same as "WebSocket" connection, except for you choose "Native" in step 4.2. + + +## PowerBI + +As an example, you can use PowerBI, which inovkes TDengine ODBC driver, to access TDengine, please refer to[Power BI](../../third-party/powerbi) for more details. diff --git a/docs/en/08-client-libraries/assets/odbc-check-data.webp b/docs/en/08-client-libraries/assets/odbc-check-data.webp new file mode 100644 index 0000000000000000000000000000000000000000..bc7867c089b6be43f0bbf3b2457d7be04f50083b GIT binary patch literal 35394 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 Y4x5@XZ)+WFYEoy~@~pr+D>16$K!ov6>Hq)$ literal 0 HcmV?d00001 diff --git a/docs/en/08-client-libraries/assets/odbc-ws-config-zh.webp b/docs/en/08-client-libraries/assets/odbc-ws-config-zh.webp new file mode 100644 index 0000000000000000000000000000000000000000..c8a6e11011da8a04e9847139bbb2cd8fcfb2bbd8 GIT binary patch literal 6234 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 "Get Data" -> "Others" -> "ODBC" -> "Connect" + +2. Choose data source name, connect to configured data source, go to the nativator, browse tables of the selected database and load data + +3. If you want to input some specific SQL, click "Advanced Options", and input your SQL in the open dialogue box and load the data. + + +To better use Power BI to analyze the data stored in TDengine, you need to understand the concepts of dimention, metric, time serie, correlation, and use your own SQL to import data. + +1. Dimention: it's normally category (text) data to describe such information as device, collection point, model. In the supertable template of TDengine, we use tag columns to store the dimention information. You can use SQL like `select distinct tbname, tag1, tag2 from supertable` to get dimentions. + +2. Metric: quantitive (numeric) fileds that can be calculated, like SUM, AVERAGE, MINIMUM. If the collecting frequency is 1 second, then there are 31,536,000 records in one year, it will be too low efficient to import so big data into Power BI. In TDengine, you can use data partition query, window partition query, in combination with pseudo columns related to window, to import downsampled data into Power BI. For more details, please refer to [TDengine Specialized Queries](https://docs.taosdata.com/taos-sql/distinguished/)。 + + - Window partition query: for example, thermal meters collect one data per second, but you need to query the average temperature every 10 minutes, you can use window subclause to get the downsampling data you need. The corresponding SQL is like `select tbname, _wstart date,avg(temperature) temp from table interval(10m)`, in which _wstart is a pseudo column indicting the start time of a widow, 10m is the duration of the window, `avg(temperature)` indicates the aggregate value inside a window. + + - Data partition query: If you want to get the aggregate value of a lot of thermal meters, you can first partition the data and then perform a series of calculation in the partitioned data spaces. The SQL you need to use is `partition by part_list`. The most common of data partition usage is that when querying a supertable, you can partition data by subtable according to tags to form the data of each subtable into a single time serie to facilitate analytical processing of time series data. + +3. Time Serie: When curve plotting or aggregating data based on time lines, date is normally required. Data or time can be imported from Excel, or retrieved from TDengine using SQL statement like `select _wstart date, count(*) cnt from test.meters where ts between A and B interval(1d) fill(0)`, in which the fill() subclause indicates the fill mode when there is data missing, pseudo column _wstart indicates the date to retrieve. + +4. Correlation: Indicates how to correlate data. Dimentions and Metrics can be correlated by tbname, dates and metrics can be correlated by date. All these can cooperate to form visual reports. + +### Example - Meters + +TDengine has its own specific data model, which uses supertable as template and creates a specific table for each device. Each table can have maximum 4,096 data columns and 128 tags. In the example of meters, assume each meter generates one record per second, then there will be 86,400 records each day and 31,536,000 records every year, then only 1,000 meters will occupy 500GB disk space. So, the common usage of Power BI should be mapping tags to dimention columns, mapping the aggregation of data columns to metric columns, to provide indicators for decision makers. + +1. Import Dimentions + +Import the tags of tables in PowerBI, and name as "tags", the SQL is like `select distinct tbname, groupid, location from test.meters;`. + +2. Import Metrics + +In Power BI, import the average current, average voltage, average phase with 1 hour window, and name it as "data", the SQL is like `select tbname, _wstart ws, avg(current), avg(voltage), avg(phase) from test.meters PARTITION by tbname interval(1h)` . + +3. Correlate Dimentions and Metrics + +In Power BI, open model view, correlate "tags" and "data", and set "tabname" as the correlation column, then you can use the data in histogram, pie chart, etc. For more information about building visual reports in PowerBI, please refer to [Power BI](https://learn.microsoft.com/power-bi/)。 \ No newline at end of file diff --git a/docs/zh/08-connector/50-odbc.mdx b/docs/zh/08-connector/50-odbc.mdx index d04d0bccee..601b3735f0 100644 --- a/docs/zh/08-connector/50-odbc.mdx +++ b/docs/zh/08-connector/50-odbc.mdx @@ -4,7 +4,7 @@ title: TDengine ODBC --- -##简介 +## 简介 TDengine ODBC 是为 TDengine 实现的 ODBC 驱动程序,支持 Windows 系统的应用(如 [PowerBI](https://powerbi.microsoft.com/zh-cn/) 等)通过 ODBC 标准接口访问本地、远程和云服务的 TDengine 数据库。 @@ -14,15 +14,15 @@ TDengine ODBC 提供基于 WebSocket(推荐)和 原生连接两种方式连 想更多了解 TDengine 时序时序数据库的使用,可访问 [TDengine官方文档](https://docs.taosdata.com/intro/)。 -##安装 +## 安装 1. 仅支持 Windows 平台。Windows 上需要安装过 VC 运行时库,可在此下载安装 [VC运行时库](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170) 如果已经安装VS开发工具可忽略。 2. 安装 TDengine Windows 客户端,版本在 3.2.1.0 或以上,都会包含 TDengine 的 ODBC 驱动。 -##配置数据源 +## 配置数据源 -###数据源连接类型与区别 +### 数据源连接类型与区别 TDengine ODBC 支持两种连接 TDengine 数据库方式:Websocket 连接与 Native 连接,其区别如下: @@ -34,7 +34,7 @@ TDengine ODBC 支持两种连接 TDengine 数据库方式:Websocket 连接与 4. 对于一般用户,建议使用 **Websocket** 连接方式,性能与 Native 差别不大,兼容性更好。 -###WebSocket 连接 +### WebSocket 连接 1. 【开始】菜单搜索打开【ODBC 数据源(64 位)】管理工具(注意不要选择ODBC 数据源(32 位)) @@ -64,7 +64,7 @@ TDengine ODBC 支持两种连接 TDengine 数据库方式:Websocket 连接与 7. 也可以在第2步选择已经配置好的数据源名通过【配置】按钮进入配置页面,修改已有配置 -###原生连接(不支持云服务) +### 原生连接(不支持云服务) 1. 【开始】菜单搜索打开【ODBC 数据源(64 位)】管理工具(注意不要选择ODBC 数据源(32 位)) @@ -94,5 +94,6 @@ TDengine ODBC 支持两种连接 TDengine 数据库方式:Websocket 连接与 7. 也可以在第2步选择已经配置好的数据源名通过【配置】按钮进入配置页面,修改已有配置 +## 与第三方集成 -使用Power BI 与 TDengine 分析时序数据请参考 [Power BI](../../third-party/powerbi) +作为使用 TDengine ODBC driver 的一个示例,你可以使用 Power BI 与 TDengine 分析时序数据。更多细节请参考 [Power BI](../../third-party/powerbi)