大数据时代的小数据神器 - asqlcell
自从Google发布了经典的MapReduce论文,以及Yahoo开源了Hadoop的实现,大数据这个词就成为了一个行业的热门。在不断提高的机器性能和各种层出不穷的工具框架加持下,数据分析开始从过去的采样抽查变成全量整体,原先被抽样丢弃的隐藏信息的价值也随之突现,数据拥有者可以发现新的关联信息,找到更细维度的特征,做出更精准的预测...
一说到大数据体系建设,各种高大上的概念自然就开始满天飞,数仓,数据湖,湖仓一体,流式计算名词一套套的。诚然对于一个每天产生巨量数据的大型企业来说,这些基础设施都是不可或缺的,甚至为了体系建设牺牲一定的灵活性也是可以接受的。但是对于大多数中小企业,或者是一些大型机构的分析师来说,真的需要这么一套庞大的体系吗?
对于大多数数据工作者来说,目前的工作流程是这样的。拿到原始数据,,要么导入Excel开始工作,要么申请数据导入数据仓库,然后在公司自建平台开始工作。单纯使用Excel处理的数据极限不超过100万行,再往上性能就不可接受。而且Excel对工程也不友好,各种误操作不容易发现记录,函数VB之类的屠龙之技在实际工作中还是存在较高的使用门槛。对于后一种情况则是依赖于公司流程的响应速度,在某些公司可能实际分析工作不到30分钟就能完成,但是入仓走流程就花了两天。
虽然现在Python非常火爆,相关的数据分析处理工具也层出不穷,但是对于大多数数据工作者来说,SQL是他们熟悉的语言。相比于面向过程的Python来说,SQL是描述性语言,只需要遵循规范告诉系统你想做什么,后台会自动完成任务的执行,而使用Python需要自己设计算法,告诉系统如何去执行,相比之下,SQL的学习门槛与表达能力要大大强于Python。业界一直在思考的问题,能否存在一个工具使得我们能结合Python与SQL的优点,快速的对源数据上手进行分析?
在进一步探讨这个问题之前,我们要回答多大的数据量算大数据?根据百度上的参考,toC的话千万级以上的数据,toB的话大概在10万级别。在这里我已某个经过数字化改造的线下广告行业为例,该公司拥有100万块线下数字显示屏,每周投放的数据量就是100万条数据,每条数据大小约为20K,那么总数据量就大约在20GB。对于这个级别的数据,使用标准的分布式大数据处理引擎固然没有问题,但是在硬件价格飞速下降的今天,特别是内存和磁盘,这个级别的数据量有没有可能在单机直接完成处理?
答案是可以的,这也是我们今天要谈的小数据,即单台电脑可以加载并完成处理的数据集合。今天向大家推荐一个小数据处理神器asqlcell,这个神器是jupyter lab的插件,通过"pip install sqlcell"及可快速完成安装。通过这个插件,允许你直接使用csv文件作为数据源,通过SQL完成对数据的分析处理,同时还支持Python与SQL的混合编程,充分发挥不同编程语言的长处,提高解决问题的效率。
下面我们来看一个例子,从Kaggle下载2020美国大选数据,打开jupyter lab,新建笔记本,导入asqlcell这个插件。
import asqlcell
导入插件后,使用sql的语法如下:%%语法代表这个单元格的输入是sql语句。
%%sql 数据集名字
你的sql脚本
下面我们加载每个县的总统选取数据到数据集president_county_candidates,这个数据集是pandas的dataframe类型,并且可用于其它sql的输入源。
%%sql president_county_candidates
select * from 'us2020/president_county_candidate.csv'
执行后结果如下,csv文件大小约1.5M,3万多条数据,30毫秒完成加载。并且返回的结果数据集支持翻页全量查看。并且对于数值类型的列,在标题栏添加了一个数值分布示意图。
下面我们要做的是根据每个县的结果,找出每个州得票最多的候选人并统计票数。对于SQL和Python都不是特别熟悉的同学,比如我来说,可以通过走一步看一步的方式一步步得到想要的结果:
1. 将原始数据按周和候选人进行group并统计每个候选人的的票信息
%%sql state_result
select state, candidate, sum(total_votes) as total
from president_county_candidates
group by state, candidate
order by state, total desc
2. 根据上一步的结果,做一个子查询先统计每个周选票最多候选人的得票数量,然后select查询去匹配这个得票数量。
%%sql state_winner
select * from state_result
where (state, total) in (select (state, max(total)) from state_result group by state
)
order by total desc
3. 我们还可以使用混合编程的模式把以上两个单元格的内容合并在一起:
state_result = %sql select state, candidate, sum(total_votes) as total from president_county_candidates group by state, candidate order by state, total desc
state_winner = %sql select * from state_result where (state, total) in (select (state, max(total)) from state_result group by state) order by total desc
state_winner
相比传统数据处理模式,asqlcell有以下优点:
- 处理数据大小只受内存限制,对于一般非在线业务的中小企业,一台服务器足以装下所有数据并进行处理,数据开箱即用。
- 加载速度块,一个大小100M,有大约250万行数据的csv文件,0.7秒内完成加载。如果原始数据经过预处理为针对列压缩的parquet格式,只需0.2秒即可完成加载。
- 后台分析引擎使用基于内存的duckdb,速度快,OLAP查询SQL语法支持完善,学习门槛低。
- 支持Python混合编程,降低学习成本,同时最大限度发挥Python与SQL各自的优势。
随着硬件成本的不断降低,小数据的处理规模也会不断上升。对于一般非在线业务企业来说,如果能做到GB级别数据的开箱即用式分析,生产效率将大大提高,同时也可以降低基础设施的建设成本。
项目代码地址:GitHub - datarho/asqlcell
欢迎提出宝贵意见。!
相关文章:

大数据时代的小数据神器 - asqlcell
自从Google发布了经典的MapReduce论文,以及Yahoo开源了Hadoop的实现,大数据这个词就成为了一个行业的热门。在不断提高的机器性能和各种层出不穷的工具框架加持下,数据分析开始从过去的采样抽查变成全量整体,原先被抽样丢弃的隐藏…...

【呕心沥血】整理全栈自动化测试技术(三):如何编写技术方案
前面两篇笔记我介绍了自动化测试前期调研注意事项和前置准备阶段切入点,有同学在后台提问: “做完前期的调研和准备工作,领导要求写一个落地方案并评审,自动化测试的落地方案该怎么写”? 首先这个要求我觉得挺正常&a…...

67. 二进制求和
文章目录题目描述竖式模拟转换为十进制计算题目描述 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1: 输入:a “11”, b “1” 输出:“100” 示例 2: 输入:a “1010”, b “1011” …...
1555数列极差(队列 优先队列 )
目录 题目描述 解题思路 代码部分 题目描述 在黑板上写了N个正整数作成的一个数列,进行如下操作:每一次擦去其中的两个数a和b,然后在数列中加入一个数a*b1,如此下去直至黑板上剩下一个数,在所有按这种操作方式最后得…...

代码随想录算法训练营第二十七天 | 93.复原IP地址,78.子集,90.子集II
一、参考资料复原IP地址题目链接/文章讲解:https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html 视频讲解:https://www.bilibili.com/video/BV1XP4y1U73i/子集题目链接/文章讲解:https://programmercarl.com/0078.…...
jvm类加载器
概念 Bootstarp ClassLoader (引导类加载器) 加载String等核心的类Ext ClassLoader (拓展类加载器)System ClassLoader (系统类加载器) 加载用户自定义的类 关系 BootstrapClassLoader 包含 ExtClassLoaderExtClassLoader 包含 SystemClassLoader彼此是包含关系,不…...

Rust学习入门--【7】Rust 数据类型
类型系统 对于任何一门语言都是重中之重,因为它体现了语言所支持的不同类型的值。 类型系统 也是 IT 初学者最难啃的三座大山之一,而类型系统之所以难以理解,主要是没有合适的现成的参考体系。 我们说类型系统 存在的目的,就是 …...

阅读MySQL必知必会,查缺补漏
MySQL自带数据库 information_schema:是MySQL自带的数据库,主要保持MySQL数据库服务器的系统信息,比如数据库的名称,数据库表的名称,字段名称,存储权限等。 performance_schema:是MySQL系统自…...

MySQL数据库10——多表连接查询
数据如果在多个表里面,需要进行连接查询。 一般在pandas里面merge合并会用到一个索引,按这个索引的规则进行合并叫做有规则的等值连接。若不按规则连接,遍历两两组合的所有可能性,叫做笛卡尔积。 笛卡尔积连接 通常人们都会设置…...
华为OD机试 - 括号检查(Python)| 真题含思路
括号检查 题目 现有一字符串 仅由 (,),{,},[,] 六种括号组成,若字符串满足以下条件之一,则为无效字符串 任意类型的左右括号数量不相等 存在未按正确顺序(先左后右)闭合的括号, 输出括号的最大嵌套深度 若字符串无效则输出 0 0 <= 字符串长度 <= 100000 输入 一个只…...

安全渗透测试中的一款免费开源的超级关键词URL采集工具
安全渗透测试中的一款免费开源的超级关键词URL采集工具。 #################### 免责声明:工具本身并无好坏,希望大家以遵守《网络安全法》相关法律为前提来使用该工具,支持研究学习,切勿用于非法犯罪活动,对于恶意使…...
数据资产管理实践白皮书(6.0版)解读
目录 第一章数据资产管理概述 ( 一 ) 数据资产管理和数据要素的关系...

c/c++开发,无可避免的函数指针使用案例
一、函数指针简介 函数指针是指指向函数而非指向对象的指针。像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关。例如: char* (*pf1)(char * p1,char *p2); 这是一个函数指针,其…...
QT(12)-QThreadPool
1 简介 QThreadPool是Qt框架中的一个类,提供了一组工作线程池。该线程池自动管理一组工作线程,在线程可用时分配任务。使用线程池的主要优点是,它可以减少创建和销毁线程的开销,因为可以重复使用线程。 线程池设计用于场景中&am…...

【Java|golang】1138. 字母板上的路径
我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]。 在本题里,字母板为board [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”],如下所示。 我们可以按下面的指令规则行动: 如果方格存…...
Flink 1.14从简单到源码第三讲
文章目录 1.flink多流操作Api1.1split 分流操作1.2.侧输出流1.3.connect 连接操作1.4.union 操作1.5 coGroup 协同分组1.6 join1.7 broadcast 广播2.process3.并行度和Api3.1 任务提交简单流程3.2 task与算子链4. Flink 时间相关(窗口计算)4.1时间语义(窗口计算)4.2 新版api指定…...

淘宝API接口系列,获取购买到的商品订单列表,卖出的商品订单列表,订单详情,订单物流,买家信息,收货地址列表,买家token
custom自定义API操作buyer_order_list获取购买到的商品订单列表buyer_order_detail获取购买到的商品订单详情buyer_order_express获取购买到的商品订单物流buyer_address_list收货地址列表buyer_address_add添加收货地址buyer_info买家信息buyer_token买家tokenseller_order_li…...

ucos-ii 的任务调度原理和实现
ucosii 任务调度和原理1、ucos-ii 任务创建与任务调度 1.1、任务的创建 当你调用 OSTaskCreate( ) 进行任务的创建的时候,会初始化任务的堆栈、保存cpu的寄存器、创建任务的控制块(OS_TCB)等的操作; if (OSTCBPrioTbl[prio] (OS_…...
Solon2 开发之容器,七、切面与函数环绕拦截
想要环绕拦截一个 Bean 的函数。需要三个前置条件: 通过注解做为“切点”,进行拦截(不能无缘无故给拦了吧?费性能)Bean 的 method 是被代理的在 Bean 被扫描之前,完成环绕拦截的注册 1、定义切点和注册环…...

代码随想录第十天(28)
文章目录28. 找出字符串中第一个匹配项的下标看答案KMPnext数组(前缀表)最长公共前后缀如何计算前缀表前缀表与next数组时间复杂度分析28. 找出字符串中第一个匹配项的下标 莫得思路……好久没做题,都已经忘得差不多了 看答案 其实就是自己…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...

2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...

Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...

【51单片机】4. 模块化编程与LCD1602Debug
1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...