DuckDB系列教程:如何分析Parquet文件

news2025/7/17 14:49:47

Parquet 是一种强大的、基于列的存储格式,适用于实现更快捷和更高效的数据分析。您可以使用 DuckDB 这种内存型分析数据库来处理 Parquet 文件并运行查询以对其进行分析。···
在这篇文章中,我们将逐步介绍如何使用 DuckDB 对存储在 Parquet 文件中的餐厅订单数据集进行分析。

安装 DuckDB 并开始使用

首先,如果您尚未安装 DuckDB,请执行以下操作:

$ curl https://install.duckdb.org | sh

现在,在您的终端中打开并启动 DuckDB。请务必使用您机器上的正确路径,并将 user 替换为您正确的用户名:

$ /home/user/.duckdb/cli/latest/duckdb

在这里插入图片描述

如果需要帮助,请查看安装指南。

▶️获取parquet文件:restaurant_orders.parquet

预览 restaurant_orders.parquet的前5行数据, 执行:

SELECT * FROM read_parquet('restaurant_orders.parquet') LIMIT 5;

输出结果大致如下:

┌──────────┬───────────────┬───┬─────────────────────┬────────────────┐
│ order_id │ customer_name │ … │     order_time      │ payment_method │
│  int64   │    varchar    │   │       varchar       │    varchar     │
├──────────┼───────────────┼───┼─────────────────────┼────────────────┤
│        1 │ Grace         │ … │ 2024-02-01 18:00:00 │ PayPal         │
│        2 │ David         │ … │ 2024-02-01 18:05:00 │ Credit Card    │
│        3 │ Eve           │ … │ 2024-02-01 18:10:00 │ PayPal         │
│        4 │ Grace         │ … │ 2024-02-01 18:15:00 │ PayPal         │
│        5 │ Charlie       │ … │ 2024-02-01 18:20:00 │ Debit Card     │
├──────────┴───────────────┴───┴─────────────────────┴────────────────┤
│ 5 rows                                          8 columns (4 shown) │
└─────────────────────────────────────────────────────────────────────┘

理解数据集结构

为了理解数据集的模式,我们可以运行:

DESCRIBE SELECT * FROM read_parquet('restaurant_orders.parquet') LIMIT 5;

这将显示每个列的数据类型及其他信息。

┌────────────────┬─────────────┬─────────┬─────────┬─────────┬─────────┐
│  column_name   │ column_type │  null   │   key   │ default │  extra  │
│    varchar     │   varchar   │ varchar │ varchar │ varchar │ varchar │
├────────────────┼─────────────┼─────────┼─────────┼─────────┼─────────┤
│ order_id       │ BIGINT      │ YES     │ NULL    │ NULL    │ NULL    │
│ customer_name  │ VARCHAR     │ YES     │ NULL    │ NULL    │ NULL    │
│ table_number   │ BIGINT      │ YES     │ NULL    │ NULL    │ NULL    │
│ menu_item      │ VARCHAR     │ YES     │ NULL    │ NULL    │ NULL    │
│ price          │ DOUBLE      │ YES     │ NULL    │ NULL    │ NULL    │
│ quantity       │ BIGINT      │ YES     │ NULL    │ NULL    │ NULL    │
│ order_time     │ VARCHAR     │ YES     │ NULL    │ NULL    │ NULL    │
│ payment_method │ VARCHAR     │ YES     │ NULL    │ NULL    │ NULL    │
└────────────────┴─────────────┴─────────┴─────────┴─────────┴─────────┘

执行基本分析

现在让我们开始分析数据。

  1. 统计订单总数

让我们来看看数据集中有多少订单:

SELECT COUNT(*) AS total_orders FROM read_parquet('restaurant_orders.parquet');

输出结果:

┌──────────────┐
│ total_orders │
│    int64     │
├──────────────┤
│      30      │
└──────────────┘
  1. 计算总收入

让我们看看这家餐厅产生了多少收入:

SELECT SUM(price * quantity) AS total_revenue FROM read_parquet('restaurant_orders.parquet');

输出结果:

┌────────────────────┐
│   total_revenue    │
│       double       │
├────────────────────┤
│ 1770.9800000000005 │
└────────────────────┘
  1. 查找最受欢迎的菜品
    哪些菜品的销量最高呢?让我们按菜品名称(menu_item)进行分组,并汇总数量:
SELECT menu_item, SUM(quantity) AS total_quantity
FROM read_parquet('restaurant_orders.parquet')
GROUP BY menu_item
ORDER BY total_quantity DESC
LIMIT 5;

输出结果:

┌───────────┬────────────────┐
│ menu_item │ total_quantity │
│  varchar  │     int128     │
├───────────┼────────────────┤
│ Pizza     │             16 │
│ Sushi     │             15 │
│ Salad     │             14 │
│ Tacos     │             14 │
│ Soup      │              7 │
└───────────┴────────────────┘
  1. 按支付方式分析销售额
    顾客是通过何种方式支付餐费的呢?让我们来一探究竟:
SELECT payment_method, COUNT(*) AS order_count
FROM read_parquet('restaurant_orders.parquet')
GROUP BY payment_method
ORDER BY order_count DESC;

输出:

┌────────────────┬─────────────┐
│ payment_method │ order_count │
│    varchar     │    int64    │
├────────────────┼─────────────┤
│ PayPal         │           9 │
│ Credit Card    │           8 │
│ Cash           │           7 │
│ Debit Card     │           6 │
└────────────────┴─────────────┘

高级分析与窗口函数

窗口函数可以帮助计算有趣的信息:

  1. 一段时间内的总收益

让我们算一下营业收入:

SELECT order_time, SUM(price * quantity) 
     OVER (ORDER BY order_time) AS running_revenue
FROM read_parquet('restaurant_orders.parquet');

从 Parquet 文件中读取餐厅订单数据,并计算随时间累积的营业收入。具体逻辑如下:

  1. 先对每行计算单笔订单收入:price * quantity
  2. 通过窗口函数 SUM(...) OVER (ORDER BY order_time),按 order_time 升序排列,累加所有历史订单收入。

结果running_revenue 表示从第一条订单到当前行的累计总收入。

核心用途:

  • 实时营收监控:观察收入随时间的变化趋势。
  • 业务分析:识别高峰时段或促销活动的收入贡献。
  • 数据验证:检查订单金额与累计值的逻辑一致性。

扩展性:可结合 PARTITION BY(如按门店或服务员分组)实现多维度累积分析。

  1. 最昂贵订单排名

现在我们将找出最昂贵的订单:

SELECT order_id, customer_name, price * quantity AS order_value,
         RANK() OVER (ORDER BY price * quantity DESC) AS rank
FROM read_parquet('restaurant_orders.parquet')
LIMIT 5;

输出:

┌──────────┬───────────────┬────────────────────┬───────┐
│ order_id │ customer_name │    order_value     │ rank  │
│  int64   │    varchar    │       double       │ int64 │
├──────────┼───────────────┼────────────────────┼───────┤
│       24 │ Hannah        │             175.36 │     1 │
│        6 │ Hannah        │             126.87 │     2 │
│       17 │ David         │ 125.10000000000001 │     3 │
│       14 │ Charlie       │             119.25 │     4 │
│       20 │ Charlie       │             119.13 │     5 │
└──────────┴───────────────┴────────────────────┴───────┘

总结:

DuckDB使处理Parquet文件变得高效——允许我们快速分析结构化数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2328951.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GRE,MGRE

GRE:静态过程,有局限性 R1 : [r1]interface Tunnel 0/0/0 --- 创建一个虚拟的隧道接口 [r1-Tunnel0/0/0]ip address 192.168.3.1 24 --- 给隧道接口分配一个 IP 地址 [r1-Tunnel0/0/0]tunnel-protocol gre --- 定义接口的封装方式 [r1-Tun…

【linux学习】linux系统调用编程

目录 一、任务、进程和线程 1.1任务 1.2进程 1.3线程 1.4线程和进程的关系 1.5 在linux系统下进程操作 二、Linux虚拟内存管理与stm32的真实物理内存区别 2.1 Linux虚拟内存管理 2.2 STM32的真实物理内存映射 2.3区别 三、 Linux系统调用函数 fork()、wait()、exec(…

Azure Speech 赋能,为智能硬件注入 AI 语音 “新灵魂”

在人工智能技术飞速发展的今天,智能硬件正逐步渗透到人们生活的方方面面。AI玩具、AI眼镜、AI鼠标等创新产品不仅提升了用户体验,更带来了前所未有的交互方式。领驭科技凭借微软Azure Speech的强大技术能力,为硬件厂商提供一站式AI语音解决方…

SignalR给特定User发送消息

1、背景 官网上SignalR的demo很详细,但是有个特别的问题,就是没有详细阐述如何给指定的用户发送消息。 2、解决思路 网上整体解决思路有三个: 1、最简单的方案,客户端连接SignalR的Hub时,只是简单的连接&#xff0c…

React: hook相当于函数吗?

一、Hook 是一个函数,但不仅仅是函数 函数的本质 Hook 确实是一个 JavaScript 函数,例如 useState、useEffect 或自定义 Hook 都是函数。它们可以接受参数(如初始状态值或依赖项数组),并返回结果(如状态值和…

【数据分享】2002-2023中国湖泊水位变化数据集(免费获取)

湖泊水位变化是研究水资源动态、生态系统演变和气候变化影响的重要指标。湖泊水位的升降不仅反映了降水、蒸发和入流水量的变化,还与人类活动、气候波动及地质过程密切相关。因此,高精度、长时间序列的湖泊水位数据对于水资源管理、洪水预测以及生态环境…

免费送源码:Java+SSM+Android Studio 基于Android Studio游戏搜索app的设计与实现 计算机毕业设计原创定制

摘要 本文旨在探讨基于SSM框架和Android Studio的游戏搜索App的设计与实现。首先,我们详细介绍了SSM框架,这是一种经典的Java Web开发框架,由Spring、SpringMVC和MyBatis三个开源项目整合而成,为开发企业级应用提供了高效、灵活、…

STM32单片机入门学习——第14节: [6-2] 定时器定时中断定时器外部时钟

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.04 STM32开发板学习——第14节: [6-2] 定时器定时中断&定时器外部时钟 前言开发…

2025-04-03 Latex学习1——本地配置Latex + VScode环境

文章目录 1 安装 Latex2 安装 VScode3 配置环境3.1 汉化 VScode3.2 安装 latex 插件3.3 配置解释 4 编译示例5 加快你的编译5.1 取消压缩5.2 使用 PDF 代替图片 6 参考文章 1 安装 Latex 本文配置环境: Windows11 打开清华大学开源软件镜像站:https://mi…

【CF】Day24——Codeforces Round 994 (Div. 2) D

D. Shift Esc 题目: 思路: 典DP的变种 如果这一题没有这个变换操作,那么是一个很典型的二维dp,每一个格子我们都选择上面和左边中的最小值即可 而这题由于可以变换,那我们就要考虑变换操作,首先一个显然…

【Java集合】LinkedList源码深度分析

参考笔记:java LinkedList 源码分析(通俗易懂)_linkedlist源码分析-CSDN博客 目录 1.前言 2.LinkedList简介 3.LinkedList的底层实现 4.LinkedList 与 ArrayList 的对比 4.1 如何选择 4.2 对比图 5.LinkedList 源码Debug 5.1 add(E e) &#xff…

Python办公自动化(2)对wordpdf的操作

一、操作word文档 终端下载操作word文件的工具库: pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx 1.遍历文档中内容 paragraphs:段落属性,返回列表类型的段落地址,遍历每一个段落地址,通过…

pip安装第三方库,但PyCharm中却无法识别

点击菜单栏File,选择Settings 系统默认的是PyCharm安装目录下的python.exe 解释器,不要用。 选择你的PYTHON的安装目录下的python.exe 解释器。如果不存在的话,增加进去 如果文件》设置打不开,需移除法化包。 打开 pycharm 安装目…

Linux C++编译及g++使用操作

编译的步骤 编译选项参数 编译生成库文件 静态库 动态库 运行可执行文件 静态库由于已经包含了链接的文件所以可以直接执行;动态库方式由于是运行时链接,所以需要指定链接的路径;

【Android】界面布局-线性布局LinearLayout-例子

线性布局(LinearLayout)是一种重要的界面布局中,也是经常使用到的一种界面布局 • 在线性布局中,所有的子元素都按照垂直或水平的顺序在界面上排列 ➢如果垂直排列,则每行仅包含一个界面元素 ➢如果水平排列&…

windows技术基础知识

NT架构 NT 就是new techonology 的英文单词缩写,是微软1993年推出操作系统的重大升级,如内存管理,安全机制,多任务,多线程支持。在此之前操作系统都是基于MS-DOS上面的图形化界面,只有有限的内存管理和多任…

在 Windows 环境下使用 VSCode 和 TinyGo 开发 ESP8266(NodeMcu) or STM32

支持的型号 https://tinygo.org/docs/reference/microcontrollers/ 1. 安装Go 2. 安装TinyGo,并添加环境变量 https://github.com/tinygo-org/tinygo/releases 3. VSCode配置,安装插件,选择设备 package mainimport ("machine"&q…

计算机视觉算法实战——基于YOLOv8的汽车试验场积水路段识别系统

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​​​​​​​ ​​ 引言:汽车试验场智能化管理的迫切需求 在现代汽车研发流程中,试验场作为验证车辆性…

One API:LLM API 管理 分发系统,github 24.2K Star!

随着人工智能领域的不断发展,国内外各大厂商纷纷推出了自己的 AI 大模型。面对 DeepSeek、OpenAI、Claude、腾讯元宝等众多平台的 API 接口差异,开发者常常需要花费大量时间调整代码、处理密钥管理与流量调控。One API 正是在这种背景下诞生,…

Android Settings 有线网设置界面优化

Android Settings 有线网设置界面优化 文章目录 Android Settings 有线网设置界面优化一、前言二、简单修改1、修改的EthernetSettings代码:2、有线网ip获取代码:3、AndroidManifest.xml定义有线网的Activity4、修改后界面: 三、其他1、有线网…