一个独立网络服务,用于解析CKAN站点数据文件的(CSV,TSV,Excel和ODS)内容,并将其推送到其数据存储中。通过qsv加速。
项目描述
DataPusher+
DataPusher+是Datapusher的分支,结合了ckanext-xloader的速度和健壮性与Datapusher的数据类型猜测。
DataPusher+使用CKAN Service Provider构建,用Messytables替换为qsv。
TNRIS/TWDB提供了使用案例,这些案例为Datapusher+的开发提供了信息和支持,特别是为了支持资源优先上传工作流程。
有关更详细的概述,请参阅CKAN每月直播2023年1月演示。
它具有以下特点
-
使用qsv的“万无一失”的超快速数据类型推断
与仅扫描前几行来猜测列类型的Messytables不同,qsv扫描整个表格,因此其数据类型推断是保证的[^1]。
尽管如此,即使扫描整个文件,qsv 仍然呈指数级地更快,因为它不仅推断数据类型,还计算摘要统计。例如,扫描一个包含270万行、124MB的CSV文件以获取类型和统计信息花费了0.16秒[^2]。
-
指数级快速加载速度
类似于xloader,我们使用PostgreSQL COPY直接将数据管道输入数据存储,绕过Datapusher使用的额外处理/转换/API调用。
但与xloader不同,我们使用适当的数据类型加载所有内容,而不是作为文本,因此不需要像xloader那样在调整数据字典后重新加载数据。
-
存储效率更高且性能更好的数据存储,更容易编写SQL查询
由于我们使用qsv保证的类型推断,以每个列最有效的PostgreSQL数据类型创建数据存储表 - 数据存储不仅更高效地存储,在加载和查询方面也表现得更加出色。
它具有“smartint”数据类型(qsv推断列值范围内的最有效整数数据类型)、综合的日期格式推断(支持19种日期格式,每种格式都有几个变体,并提供可配置的DMY/MDY偏好解析)以及将日期自动格式化为RFC3339格式以便作为Postgres时间戳存储;具有基数感知的可配置自动索引;自动清洗列名以确保有效的PostgreSQL列标识符;加载后自动PostgreSQL真空和资源分析;等等 - DP+使数据存储能够充分发挥PostgreSQL的全部功能。
可配置的资源自动别名也使编写SQL查询更容易,因为您可以使用更直观的资源别名而不是难以理解的资源ID。
-
生产就绪的健壮性
在生产中,支持问题的主要来源是Datapusher - 主要是因为数据质量问题以及Datapusher无法正确推断数据类型、优雅地处理错误[^3]以及提供数据发布者可操作的信息来纠正数据。
Datapusher+'的设计直接解决了所有这些问题。
-
更详细的数据存储加载消息
Datapusher+的消息设计得更加详细和可操作,因此数据发布者的用户体验远更好,并使得以资源为中心的上传工作流程成为可能。
-
使用qsv进行扩展预处理
Datapusher+利用qsv
- 创建“更智能”的数据字典,具有
- 保证的数据类型推断
- 可选的自动选择最佳整数PostgreSQL数据类型(“smartint”)的能力,根据数字列的范围(PostgreSQL的int、bigint和numeric类型)以实现最佳的存储/索引效率和SQL查询性能。
- 清洗列名(保证有效的PostgreSQL列标识符)同时保留原始列名作为标签,该标签用于在DataTables_view中标记列。
- 一个可选的“摘要统计”资源,作为数据字典的扩展,为每个列提供全面的摘要统计信息 - 总和、最小/最大/范围、最小/最大长度、平均值、标准差、方差、空值计数、稀疏度、四分位数、四分位距、下/上限边界、偏度、中位数、众数/多众数以及基数。
- 将 Excel 和 OpenOffice/LibreOffice Calc (ODS) 文件转换为 CSV,可以默认选择使用哪个工作表(例如,0 是第一个工作表,-1 是最后一个工作表,-2 是倒数第二个工作表等)。
- 转换各种日期格式(识别 19 种日期格式,每种格式都有几个变体;总共约 80 种日期格式排列)到标准的 RFC 3339 格式。
- 通过创建 CSV 索引来启用对 CSV 的随机访问 - 这也使得可以同时并行处理 CSV 的不同部分(这是类型推断和统计计算如此快速的主要原因)。
- 通过 CSV 索引即时计算行数。
- 验证上传的 CSV 是否符合 RFC-4180 标准。
- 将 CSV/TSV 方言标准化和转码为标准的 UTF-8 编码的 RFC-4180 CSV 格式。
- 可选地创建一个预览子集,可以仅下载文件的前
n
行预览,而不是整个文件(例如,仅下载 3 GB CSV 文件的前 1,000 行 - 特别适合于仅想要收集/编目外部站点元数据和每个文件的少量样本的情况)。 - 可选地从文件末尾创建预览子集(例如,最后 1,000 行,适用于时间序列/传感器数据)。
- 自动根据列的基数/格式创建索引(为具有所有唯一值的列创建唯一索引,自动索引基数低于给定阈值的列;自动索引日期列)。
- 检查重复项,并可选项删除重复行。
- 可选地筛选个人信息(PII),可选择将 PII 候选行“隔离”在单独的资源中,同时仍创建筛选后的资源。
- 可选地指定自定义 PII 筛选正则表达式集,而不是 默认 PII 筛选正则表达式集。
即使有所有这些预处理任务,qsv 通常在 5 秒内完成所有分析任务,即使是 100 MB 的 CSV 文件。
Datapusher+ 的未来版本将进一步利用 qsv 的 80 多条命令来执行额外的预处理、数据处理和验证。路线图可在 此处 查看。欢迎提出想法、建议和反馈!
- 创建“更智能”的数据字典,具有
[^1]: 为什么使用 qsv 而不是像 pandas 这样的“正确”的 Python 数据分析库? [^2]: 在 Ryzen 4800H(8 个物理/16 个逻辑核心)、32 GB 内存和 1 TB SSD 上使用索引运行 qsv stats
对 qsv 演习示例文件 需要 0.16 秒。没有索引,需要 1.3 秒。[^3]: 假设你有一个 100 万行的 CSV,最后一行有一个数值列的无效值(例如,“N/A”而不是数字)。在花费数小时缓慢推送数据后,旧的数据推送器会在最后一行中断,整个作业无效。好吧,这很糟糕,但更糟糕的是,旧的表已经删除,Datapusher 也没有告诉你作业失败的原因!天哪!!!
开发安装
Datapusher+ 是 Datapusher 的直接替代品,因此安装方式相同。
-
安装所需的包。
sudo apt install python3-virtualenv python3-dev python3-pip python3-wheel build-essential libxslt1-dev libxml2-dev zlib1g-dev git libffi-dev libpq-dev file
-
使用至少 python 3.8 为 Datapusher+ 创建虚拟环境。
cd /usr/lib/ckan sudo python3.8 -m venv dpplus_venv sudo chown -R $(whoami) dpplus_venv . dpplus_venv/bin/activate cd dpplus_venv
ℹ️ 注意: DP+ 至少需要 Python 3.8,因为它大量使用了 3.7/3.8 版本中引入的 subprocess 模块 的新功能。如果您正在使用 Ubuntu 18.04 或更早版本,请按照以下步骤安装 Python 3.8
sudo add-apt-repository ppa:deadsnakes/ppa # we use 3.8 here, but you can get a higher version by changing the version suffix of the packages below sudo apt install python3.8 python3.8-venv python3.8-dev # install additional dependencies sudo apt install build-essential libxslt1-dev libxml2-dev zlib1g-dev git libffi-dev
请注意,DP+ 仍然与 CKAN≤2.8 兼容,后者使用较旧的 Python 版本。
-
获取代码。
mkdir src cd src git clone --branch 0.11.0 https://github.com/datHere/datapusher-plus cd datapusher-plus
-
安装依赖项。
pip install wheel pip install -r requirements-dev.txt pip install -e .
-
安装 qsv。
下载适合您平台的预编译二进制文件 并将其复制到相应的目录中,例如对于 Linux
wget https://github.com/jqnatividad/qsv/releases/download/0.108.0/qsv-0.108.0-x86_64-unknown-linux-gnu.zip unzip qsv-0.108.0-x86_64-unknown-linux-gnu.zip rm qsv-0.108.0-x86_64-unknown-linux-gnu.zip sudo mv qsv* /usr/local/bin
或者,如果您想从源代码安装 qsv,请按照此处的说明进行操作。注意,当从源代码编译时,您可能需要查看性能调整部分以从 qsv 中提取更多性能。
另外,如果您在启动 qsv 时遇到 glibc 错误,您的 Linux 发行版可能没有所需的 GNU C 库版本(当运行 Ubuntu 18.04 或更早版本时将出现这种情况)。如果是这样,请使用
qsvdp_glibc-2.31
二进制文件,因为它链接到较旧的 glibc 版本。如果仍然失败,请使用unknown-linux-musl.zip
存档,因为它与 MUSL C 库静态链接。如果您已经安装了 qsv,请使用 --update 选项将其更新到最新版本。
qsvdp --update
ℹ️ 注意: qsv 是一个通用的 CSV 数据处理工具包,定期更新。要更新到最新版本,只需使用
--update
选项运行 qsv,它将检查最新版本并按需更新。 -
配置 Datapusher+ 数据库。
确保创建
datapusher
PostgreSQL 用户和datapusher_jobs
数据库(请参阅DataPusher+ 数据库设置)。 -
将
datapusher/dot-env.template
复制到datapusher/.env
并修改您的配置。cd /usr/lib/ckan/dpplus_env/src/datapusher-plus/datapusher cp dot-env.template .env # configure your installation as required nano .env
-
在
dpplus_venv
虚拟环境中运行 Datapusher+。python main.py config.py
默认情况下,DP+ 应该在以下端口运行
生产部署
有两种方法可以部署 Datapusher+
-
手动部署
这些说明在端口 8800 上设置了 DataPusher web 服务,该服务在 uWSGI 上运行,但可以轻松地适应其他 WSGI 服务器,如 Gunicorn。您可能需要设置 Nginx 作为其前面的反向代理,并使用类似 Supervisor 的工具来保持进程运行。
# Install requirements for DataPusher+. Be sure to have at least Python 3.8 sudo apt install python3-virtualenv python3-dev python3-pip python3-wheel build-essential libxslt1-dev libxml2-dev zlib1g-dev git libffi-dev libpq-dev file # Install qsv, if required wget https://github.com/jqnatividad/qsv/releases/download/0.108.0/qsv-0.108.0-x86_64-unknown-linux-gnu.zip -P /tmp unzip /tmp/qsv-0.108.0-x86_64-unknown-linux-gnu.zip -d /tmp rm /tmp/qsv-0.108.0-x86_64-unknown-linux-gnu.zip sudo mv /tmp/qsv* /usr/local/bin # if qsv is already installed, be sure to update it to the latest release sudo qsvdp --update # if you get a glibc error when running `qsvdp --update` # you're on an old distro (e.g. Ubuntu 18.04) without the required version of the glibc libraries. # If so, try running the qsvdp_glibc-2.31 binary instead. If it runs, you can use it instead of the default qsvdp binary. # If that still doesnt work, use the statically linked MUSL version instead # https://github.com/jqnatividad/qsv/releases/download/0.108.0/qsv-0.108.0-x86_64-unknown-linux-musl.zip # find out the locale settings locale # ONLY IF LANG is not "en_US.UTF-8", set locale export LC_ALL="en_US.UTF-8" export LC_CTYPE="en_US.UTF-8" sudo dpkg-reconfigure locales # Create a virtualenv for DataPusher+. DP+ requires at least python 3.8. sudo python3.8 -m venv /usr/lib/ckan/dpplus_venv sudo chown -R $(whoami) dpplus_venv # install datapusher-plus in the virtual environment . /usr/lib/ckan/dpplus_venv/bin/activate pip install wheel pip install datapusher-plus # create an .env file and tune DP+ settings. Tune the uwsgi.ini file as well sudo mkdir -p /etc/ckan/datapusher-plus sudo curl https://raw.githubusercontent.com/dathere/datapusher-plus/master/datapusher/dot-env.template -o /etc/ckan/datapusher-plus/.env sudo curl https://raw.githubusercontent.com/dathere/datapusher-plus/master/deployment/datapusher-uwsgi.ini -o /etc/ckan/datapusher-plus/uwsgi.ini # Be sure to initialize the database if required. (See Database Setup section below) # Be sure to edit the .env file and set the right database connect strings! # Create a user to run the web service (if necessary) sudo addgroup www-data sudo adduser -G www-data www-data
在此阶段,您可以使用以下命令运行 DataPusher+
/usr/lib/ckan/dpplus_venv/bin/uwsgi --enable-threads -i /etc/ckan/datapusher-plus/uwsgi.ini
在使用不同用户时,您可能需要更改
uwsgi.ini
文件中的uid
和guid
。要使用 supervisor 部署它
sudo curl https://raw.githubusercontent.com/dathere/datapusher-plus/master/deployment/datapusher-uwsgi.conf -o /etc/supervisor/conf.d/datapusher-uwsgi.conf sudo service supervisor restart
-
容器化部署
由于 Datapusher+ 的复杂性,如上述程序所示,容器化安装将使将 DP+ 部署到生产环境以及进行实验变得更加容易。
设置 DP+ Docker 实例的说明可以在此处找到。
DP+ Docker 还将公开其他功能和行政接口,不仅用于管理 Datapusher+ 任务,还用于管理 CKAN 数据存储。
配置
CKAN 配置
将 datapusher
添加到您的 CKAN 配置文件中的插件(通常位于 /etc/ckan/default/ckan.ini
)
ckan.plugins = <other plugins> datapusher
为了告诉 CKAN 该 webservice 的位置,必须将以下内容添加到 CKAN 配置文件的 [app:main]
部分
ckan.datapusher.url = http://127.0.0.1:8800/
CKAN 配置中还有其他选项允许您自定义 CKAN - DataPusher 集成。有关更多详细信息,请参阅 CKAN 文档中的DataPusher 设置部分。
ℹ️ 注意: DP+ 识别一些额外的 TSV 和电子表格子格式 - Excel 电子表格的
xlsm
和xlsb
,以及 TSV 文件的tab
。为了处理这些子格式,请在 CKAN.INI 文件中将ckan.datapusher.formats
设置如下ckan.datapusher.formats = csv xls xlsx xlsm xlsb tsv tab application/csv application/vnd.ms-excel application/vnd.openxmlformats-officedocument.spreadsheetml.sheet ods application/vnd.oasis.opendocument.spreadsheet并将此条目添加到您的 CKAN 的
resource_formats.json
文件中。["TAB", "Tab Separated Values File", "text/tab-separated-values", []],
数据推送器+ 配置
数据推送器+ 实例配置在 DP+ 工作目录中的 .env
文件中(在生产部署时为 /etc/ckan/datapusher-plus
。在开发安装时为 datapusher-plus/datapusher
源目录。)
有关可用配置选项的摘要,请参阅 dot-env.template。
数据推送器+ 数据库设置
DP+ 需要一个名为 datapusher
的专用 PostgreSQL 账户来连接到 CKAN 数据存储。
为了创建 datapusher
用户并授予其对 datastore_default
数据库所需的权限
su - postgres
psql -d datastore_default
CREATE ROLE datapusher LOGIN PASSWORD 'YOURPASSWORD';
GRANT CREATE, CONNECT, TEMPORARY, SUPERUSER ON DATABASE datastore_default TO datapusher;
GRANT SELECT, INSERT, UPDATE, DELETE, TRUNCATE ON ALL TABLES IN SCHEMA public TO datapusher;
\q
DP+ 还需要一个自己的 job_store 数据库来跟踪所有 DP+ 作业。在原始 Datapusher 中,这默认是一个 sqlite 数据库。尽管 DP+ 仍然可以使用 sqlite 数据库,但我们不建议使用它。
为了设置 datapusher_jobs
数据库及其用户
sudo -u postgres createuser -S -D -R -P datapusher_jobs
sudo -u postgres createdb -O datapusher_jobs datapusher_jobs -E utf-8
使用方法
任何具有支持格式(在 ckan.datapusher.formats
中定义)的文件都将尝试加载到数据存储中。
您还可以手动触发资源重新提交。当在 CKAN 中编辑资源时(在资源页面上单击“管理”按钮),将出现一个名为“数据存储”的新选项卡。它将包含上次尝试上传的日志和一个重新尝试上传的按钮。一旦资源已“推送”到数据存储中,还将在“数据字典”选项卡中进行调整,数据发布者可以精细调整推断的数据字典。
命令行
运行以下命令将所有资源提交给数据推送器,尽管它将跳过数据文件哈希值没有更改的文件
ckan -c /etc/ckan/default/ckan.ini datapusher resubmit
在 CKAN<=2.8
paster --plugin=ckan datapusher resubmit -c /etc/ckan/default/ckan.ini
要重新提交特定的资源,无论数据文件哈希值是否更改:
ckan -c /etc/ckan/default/ckan.ini datapusher submit {dataset_id}
在 CKAN<=2.8
paster --plugin=ckan datapusher submit <pkgname> -c /etc/ckan/default/ckan.ini
测试
要测试 Datapusher-plus,您可以使用以下测试脚本,该脚本在 GitHub 上提供:测试脚本。
卸载数据推送器+
如果您需要删除 Datapusher+,并且遵循了上述开发或生产安装程序
# if you're running inside the dpplus_venv virtual environment, deactivate it first
deactivate
# remove the DP+ python virtual environment
sudo rm -rf /usr/lib/ckan/dpplus_venv
# remove the supervisor DP+ configuration
sudo rm -rf /etc/supervisor/conf.d/datapusher-uwsgi.conf
# remove the DP+ production deployment directory
sudo rm -rf /etc/ckan/datapusher-plus
# remove qsv binary variants
sudo rm /usr/local/bin/qsv /usr/local/bin/qsvdp /usr/local/bin/qsvlite /usr/local/bin/qsv_nightly /usr/local/bin/qsvdp_nightly /usr/local/bin/qsvlite_nightly
# restart the supervisor, without the Datapusher+ service
sudo service supervisor reload
# ========= DATABASE objects ============
# OPTIONAL: backup the datapusher_jobs database first if
# you want to retain the DP+ job history
sudo -u postgres pg_dump --format=custom -d datapusher_jobs > datapusher_jobs.dump
# to remove the Datapusher+ job database and the datapusher_jobs user/role
sudo -u postgres dropdb datapusher_jobs
sudo -u postgres dropuser datapusher_jobs
# to drop the datapusher user which DP+ uses to write to the CKAN Datastore
sudo -u postgres dropuser datapusher
为了确保数据推送器+ 服务在上传表格资源时不会自动调用,请从您的 ckan.ini
文件中的 ckan.plugins
中删除 datapusher
。
还要从您的 ckan.ini
中删除/注释以下 ckan.datapusher
条目
ckan.datapusher.formats
ckan.datapusher.url
ckan.datapusher.callback_url_base
ckan.datapusher.assume_task_stale_after
请注意,之前已推送的资源仍可在 CKAN 数据存储中找到。您必须单独使用 UI 或 CKAN resource_delete API 删除这些资源。
如果您不再使用 CKAN 数据存储
- 编辑您的
ckan.ini
并从ckan.plugins
中删除/注释datastore
。 - 删除/注释
ckan.datastore.write_url
和ckan.datastore.read_url
条目。
为了确认卸载成功,上传一个新的表格资源并检查
- 表格资源视图(例如,datatables_view、recline_view 等)不再可用
- 数据存储 和 数据字典 选项卡不再可用
- 资源页面上的 下载 按钮不再提供其他下载格式(CSV、TSV、JSON、XML)
- 表格资源上的 数据存储 API 按钮不再显示
许可证
本材料版权(c)2020 开放知识基金会及其他贡献者
它开源并许可在 GNU Affero 通用公共许可证(AGPL)v3.0 下,其完整文本可在以下位置找到
项目详情
下载文件
下载适合您平台文件的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码分布
构建分布
datapusher-plus-0.16.4.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b506612b56c4ee4128f5fc1fc990d505ac7735220c8b95b66a4b76ded546ea51 |
|
MD5 | 83cb8076e69cc8b02b56059f77761cb6 |
|
BLAKE2b-256 | 6506ae24a09a77b2782632588a1c409013bb5d50df4c0aa3e887da0dca635848 |
datapusher_plus-0.16.4-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0d507a850b58699a5af736629c251269cb4f902329775589b8fdc794158fa092 |
|
MD5 | 47cbd58d5ac6d8ee3a871b43d1b073b3 |
|
BLAKE2b-256 | ebcb4dc397e564d2131df0d63ec37421021ce03a66fcd4e122a3ae6a26466c23 |