个人认为数据分析就2步, 获取数据, 分析数据.
获取数据之前, 首先要看数据在哪, 通常可能在数据库产品里、也可能是本地文件、也可能是对象存储中的文件.
文件格式可能有excel、csv、txt、parquet等等.
就以上这些, 感觉需要一款专业的付费应用来支撑.
然后是分析数据, 分析通常需要对数据进行清洗、转换、处理, 然后是展示. 感觉又是一堆的功能, 也需要一款专业的付费应用来支撑.
今天在DuckDB中文社区群看到高手了, 感叹民间高手多啊. 看到群里的讨论, 简直帅哭了.
Excel通过ODBC直接调用DuckDB, 通过DuckDB可以完成数据的获取、处理、转换、统计等等一系列数据分析动作. 这些对DuckDB来讲易如反掌, 而且DuckDB又不用安装启动, 爽翻了!
通过Excel则可对最终数据进行展示. (当然Excel本身还具备数据处理的能力, 如有必要也可以在最终数据展示之前进行使用.)
当然了, DuckDB的野心不止出数据获取和处理, 它可能会把UI也弄进来. 如下文所示:
下面简单给个Demo, 在excel中如何使用DuckDB.
我使用macOS进行演示.
首先安装ODBC驱动, 参考:
https://duckdb.org/docs/stable/clients/odbc/macos.html
安装unixODBC
brew install unixodbc
验证安装是否正确:
$ odbcinst -j
unixODBC 2.3.12
DRIVERS............: /opt/homebrew/etc/odbcinst.ini
SYSTEM DATA SOURCES: /opt/homebrew/etc/odbc.ini
FILE DATA SOURCES..: /opt/homebrew/etc/ODBCDataSources
USER DATA SOURCES..: /Users/digoal/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
编译DuckDB odbc driver
git clone --depth 1 https://github.com/duckdb/duckdb-odbc
cd duckdb-odbc
make -j 4
$ pwd
/Users/digoal/Downloads
$ ll /Users/digoal/duckdb-odbc/build/release
total 97640
drwxr-xr-x 3 digoal staff 96B Jun 20 15:26 ..
-rw-r--r-- 1 digoal staff 15K Jun 20 15:26 CMakeCache.txt
-rw-r--r-- 1 digoal staff 1.7K Jun 20 15:26 cmake_install.cmake
-rw-r--r-- 1 digoal staff 541K Jun 20 15:26 Makefile
drwxr-xr-x 9 digoal staff 288B Jun 20 15:26 src
drwxr-xr-x 9 digoal staff 288B Jun 20 15:30 .
-rwxr-xr-x 1 digoal staff 47M Jun 20 15:30 libduckdb_odbc.dylib # 这个文件就是duckdb odbc driver
drwxr-xr-x 7 digoal staff 224B Jun 20 15:30 test
drwxr-xr-x 13 digoal staff 416B Jun 20 15:30 CMakeFiles
配置ODBC, 参考:
https://duckdb.org/docs/stable/clients/odbc/configuration.html
编辑/opt/homebrew/etc/odbc.ini文件
vi /opt/homebrew/etc/odbc.ini
[DuckDB]
Driver = DuckDB Driver
Database = :memory:
access_mode = read_write
编辑/opt/homebrew/etc/odbcinst.ini文件
vi /opt/homebrew/etc/odbcinst.ini
[ODBC]
Trace = yes
TraceFile = /tmp/odbctrace
[DuckDB Driver]
Description = DuckDB ODBC Driver
Driver = /Users/digoal/duckdb-odbc/build/release/libduckdb_odbc.dylib
UsageCount = 1
测试
isql -v DuckDB
有问题可查看日志
/tmp/odbctrace
需要配置DYLD_LIBRARY_PATH环境变量(或者把libduckdb_odbc.dylib拷贝到/usr/local/lib目录, 使用这个目录中的dylib没有file not found问题), 否则找不到该libduckdb_odbc.dylib文件.
$ isql -v DuckDB
[01000][unixODBC][Driver Manager]Can't open lib '/Users/digoal/duckdb-odbc/build/release/libduckdb_odbc.dylib' : file not found
[ISQL]ERROR: Could not SQLConnect
$ otool -L /Users/digoal/duckdb-odbc/build/release/libduckdb_odbc.dylib
/Users/digoal/duckdb-odbc/build/release/libduckdb_odbc.dylib:
@rpath/libduckdb_odbc.dylib (compatibility version 0.0.0, current version 0.0.0)
/opt/homebrew/opt/unixodbc/lib/libodbcinst.2.dylib (compatibility version 3.0.0, current version 3.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1500.65.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1319.100.3)
可能是这个 @rpath 的问题.
$ export DYLD_LIBRARY_PATH=/Users/digoal/duckdb-odbc/build/release:$DYLD_LIBRARY_PATH
$ isql -v DuckDB
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| echo [string] |
| quit |
| |
+---------------------------------------+
SQL> create table test (id int);
SQLRowCount returns -1
SQL> insert into test values (1);
SQLRowCount returns 1
SQL> select * from test;
+------------+
| id |
+------------+
| 1 |
+------------+
SQLRowCount returns -1
1 rows fetched
SQL> insert into test select * from range(1,1000000) as t(id);
SQLRowCount returns 1
SQL> select count(*) from test;
+---------------------+
| count_star() |
+---------------------+
| 1000000 |
+---------------------+
SQLRowCount returns -1
1 rows fetched
如果ODBC配置完成后, 应该可以在excel中使用odbc通过DuckDB请求任意位置的数据.
截取了群里网友发来的截图如下, 大家参考一二
微软excel工程师发威





