TDengine数据库-TAOS涛思数据-批量下载上亿大数据成csv 解决bug: Query interrupted (Query terminated) 4798749 row(s) in set

2023-11-20


前言

TDengine 是一款由中国团队开发的开源、云原生的时序数据库(Time Series Database),专为物联网、工业互联网、金融、IT 运维监控等场景设计并优化。它能让大量设备、数据采集器每天产生的高达 TB 甚至 PB 级的数据得到高效实时的处理,对业务的运行状态进行实时的监测、预警,从大数据中挖掘出商业价值。

它具备处理物联网数据所需要的所有功能,包括:

  • 类SQL查询语言来插入或查询数据
  • 支持C/C++, Java(JDBC), Python, Go, RESTful, and Node.JS 等开发接口
  • 通过TDengine Shell或Python/R/Matlab可做各种Ad Hoc查询分析
  • 通过连续查询,支持基于滑动窗口的流式计算
  • 引入超级表,让设备之间的数据聚合通过标签变得简单、灵活
  • 内嵌消息队列,应用可订阅最新的数据
  • 内嵌缓存机制,每台设备的最新状态或记录都可快速获得
  • 无历史数据与实时数据之分

taos shell命令批量下载数据库遇到中断问题

在使用taos shell命令直接下载某个超级表到指定csv文件中,发现当表中数据超过几百万时,就会出现请求中断:

Query interrupted (Query terminated),4798749 row(s) in set (357.461000s)

具体taos shell 命令如下:

SELECT * FROM <database_name> >> <***.csv>;

在这里插入图片描述

分析问题:

这种问题很有可能是taos数据库在读取较大表格时候,由于数据量大,电脑缓存不够,或者是内部配置文件做了限制导致的。

解决方案

查看tao.cfg文件

尽量不要去设置这些max什么的限制
在这里插入图片描述

使用分页下载,在合并csv

1. 构建.sql文件批量进行下载

基本步骤:

  1. 获取到taos超级表名
  2. 根据超级表名及分页限制数,打印SQL语句

这里注意分页Taos命令语句如下:

SELECT * FROM <table_name> LIMIT 1000000 offset 1000000 >> data_<number>.csv

详细代码如下:

import taos

def get_number(numbers,limit_numbers):
    number_list = []
    mid_number = numbers//limit_numbers
    mod_number = numbers%limit_numbers
    for i in range(mid_number+1):
        # print(i)
        if mod_number and i!=mid_number:
            number_list.append([limit_numbers,i*limit_numbers])
            
        elif mod_number and i==mid_number:
            number_list.append([mod_number,i*limit_numbers])
        elif i!=mid_number:
            number_list.append([limit_numbers,i*limit_numbers])
        else:
            pass
            
    # print(number_list)
    return number_list


class UtilsTao:

    def __init__(self,db_name,port, hostname, username,password):
        self.db_name = db_name
        self.port = port
        self.hostname = hostname
        self.username = username
        self.password = password
        self.conn, self.cursor = self.connect_taos_db() # Connect to database and cursor.


    def connect_taos_db(self):
        # 连接Taos数据库
        conn = taos.connect(host=self.hostname, port=self.port, user=self.username, password=self.password, database=self.db_name)
        cursor = conn.cursor()
        cursor.execute("use {}".format(self.db_name)) 
        return conn, cursor

    def printsql(self,super_tables):
        for table in super_tables:
            # 查看指定表中的行数
            self.cursor.execute("SELECT COUNT(*) FROM {}".format(table)) 
            # 如果行数超过100万行则进行分页获取表中数据,并打印出sql语句。
            results = self.cursor.fetchall()  # Get all rows from table.
            length = int(results[0][0])
            if length >= 1000000: 
                number_list = get_number(numbers=length, limit_numbers=1000000)
                # 执行分页查询,获取表中数据的行数列表。将其打印出来
                for i in number_list:
                    if i[1] == 0 :
                        sql = "SELECT * FROM {} LIMIT 1000000 >> {}_{}_data_{}.csv;".format(table,self.db_name,table,i[1])
                        print(sql)
                        # self.cursor.execute(sql)
                    else:
                        sql = "SELECT * FROM {} LIMIT 1000000 offset {} >> {}_{}_data_{}.csv;".format(table,i[1],self.db_name,table,i[1])
                        print(sql)
                        # self.cursor.execute(sql)        
            else:
                sql_content = "SELECT * FROM {} >> {}_{}_data.csv;".format(table,self.db_name,table)
                # self.cursor.execute(sql_content)
                print(sql_content)
                # results_csv = self.cursor.fetchall()
        

    def close_taos_db(self):
        # 关闭Taos数据库
        # 关闭数据库连接
        self.cursor.close()
        self.conn.close()

    def get_super_tables_name(self):
        # get all super tablesname from database;
        sql = "SHOW stables"# Show all tables name in database. 
        self.cursor.execute(sql) # Execute the SQL statement.
        # 获取超级表名称列表

        results = self.cursor.fetchall()
        super_tables = [row[0] for row in results]

        # 输出超级表名称列表
        print(super_tables)
        return super_tables
        
        
if __name__ == '__main__':  
    db_name,hostname,port, username,password = 'xxx', 'xxxx',8888, 'xxxx', 'xxxxx'  
    tao_ = UtilsTao(db_name,port,hostname,username,password)
    super_tables = tao_.get_super_tables_name()
    tao_.printsql(super_tables)
    tao_.close_taos_db()

输出如下:
在这里插入图片描述

  1. 复制SQL语句,生成.sql文件
  2. 在taos Shell命令窗口运行批量下载命令
source sql_batch.sql

在这里插入图片描述
可以看到Query 均顺利为OK了,意思就下载下来了,这里可以看到有些数据量因为小于100万,则直接下载成一个csv文件了。

在这里插入图片描述

2. 合并分csv文件成总csv文件

接下来对分页的csv文件进行合并成总csv文件。具体代码如下:

import pandas as pd
import os

class ConcatCsv:
    def __init__(self, dir, db_name):
        self.dir = dir
        self.dbname = db_name  # 数据库名称
        
    def get_table_list(self):
        file_name = os.listdir(self.dir)  # 获取文件夹中的文件名称列表。
        table_dict = {}
        for file_ in file_name:
            table_name = file_.split(self.dbname)[1].split("_")[1]
            if table_name in table_dict.keys():  # 检查列表中是否有该表名称。如果有,则加入到对应的列表中。
                number = table_dict[table_name] + 1
                table_dict.update({table_name: number})
            else:
                table_dict.update({table_name: 1})
        return file_name, table_dict    
    
    def concat_csv(self):
        file_name, table_dict = self.get_table_list()  
        for table_name, number in table_dict.items():
            if number == 1:
                pass
            else:
                list_table = [file for file in file_name if table_name in file]
                # 给list_table排序,注意一定要排序,对于时序数据才能按照顺序合并csv文件
                list_table.sort(key=lambda x: str(x.split("_")[-1]))
                print(list_table)
                for i, table_ in enumerate(list_table):
                    if i == 0:
                        c = pd.read_csv(self.dir + os.sep + table_)
                    else:
                        c = pd.concat([c, pd.read_csv(self.dir + os.sep + table_)],axis=0, ignore_index=False)   
                c.to_csv(self.dir + os.sep  + self.dbname + "_" + table_name + ".csv", index= False) 
                
                for table_ in list_table:  # 删除旧的文件列表。
                    os.remove(self.dir + os.sep + table_)
            
        print("concat_csv task is done!" )    



if __name__ == '__main__':
    dir_path = r'E:\Data\数据库'
    table_dict = ConcatCsv(dir_path, 'xxxx').concat_csv()

注意:合并成总csv文件后,会删除掉分csv文件,最后只保留总csv文件

总结

整体上taos数据库中表的下载速度还是很快,平均100万的数据,最多200-300秒左右,使用本文方法,可以通过taos的命令窗口命令,批量下载,最终生成想要的总csv文件。

其它资料下载

如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TDengine数据库-TAOS涛思数据-批量下载上亿大数据成csv 解决bug: Query interrupted (Query terminated) 4798749 row(s) in set 的相关文章

  • 深度强化学习的核心算法:从QLearning到Deep QNetwork

    1 背景介绍 深度强化学习 Deep Reinforcement Learning DRL 是一种通过智能体与环境的互动学习的方法 它可以帮助智能体在没有明确指导的情况下学习如何执行最佳的动作 从而最大化收益 深度强化学习结合了强化学习 R
  • 慢思维大脑:SOP流程的心理学背景

    1 背景介绍 慢思维大脑 SOP流程的心理学背景 慢思维是指人类大脑在处理复杂问题 做出重要决策时所采用的思考方式 它与快速 自动的快思维相对 主要通过以下几种方式表现 深入思考 慢思维会让人类大脑深入思考问题的本质 从而找出更深层次的解决
  • 线性代数在深度学习中的角色

    1 背景介绍 深度学习是一种人工智能技术 它主要通过神经网络来学习和模拟人类大脑的思维过程 线性代数是一门数学分支 它研究的是向量和矩阵的运算 在深度学习中 线性代数起着非常重要的作用 因为它为神经网络提供了数学模型和计算方法 在这篇文章中
  • 如何成为一名数据科学家:必须掌握的技能和知识

    1 背景介绍 数据科学家是一种新兴的职业 它结合了计算机科学 统计学 数学和领域知识等多个领域的知识和技能 以解决实际问题 数据科学家的主要任务是收集 清洗 分析和解释大量数据 从中挖掘有价值的信息和知识 并将其应用于决策和预测 数据科学家
  • 【计算机毕业设计】实验室预约管理

    身处网络时代 随着网络系统体系发展的不断成熟和完善 人们的生活也随之发生了很大的变化 人们在追求较高物质生活的同时 也在想着如何使自身的精神内涵得到提升 而读书就是人们获得精神享受非常重要的途径 为了满足人们随时随地只要有网络就可以看书的要
  • 【计算机毕业设计】基于web的山东红色旅游信息管理系统

    有效的处理想要的相关信息和如何传播有效的信息 一直是人类不断探索的动力 人类文明火种的传承都是通过了多种媒介作为载体 也是随着社会生产力的发展不断的更新 随着互联网的到来 信息传播与管理都上升了一个新的台阶 并且方便应用的同时也要考虑信息传
  • 【计算机毕业设计】线上招聘问答系统

    计算机网络发展到现在已经好几十年了 在理论上面已经有了很丰富的基础 并且在现实生活中也到处都在使用 可以说 经过几十年的发展 互联网技术已经把地域信息的隔阂给消除了 让整个世界都可以即时通话和联系 极大的方便了人们的生活 所以说 线上招聘问
  • 【计算机毕业设计】学生就业管理系统

    如今社会上各行各业 都喜欢用自己行业的专属软件工作 互联网发展到这个时候 人们已经发现离不开了互联网 新技术的产生 往往能解决一些老技术的弊端问题 因为传统学生就业信息管理难度大 容错率低 管理人员处理数据费工费时 所以专门为解决这个难题开
  • 软件测试/测试开发/全日制/测试管理丨Redis内存数据库

    Redis是一种开源 内存中的数据结构存储系统 它提供了高性能 灵活性和丰富的数据结构 以下是Redis内存数据库的基本介绍 键值存储 Redis基于键值对的存储模型 其中每个键都与一个特定的值相关联 这种简单的数据模型使其易于使用和理解
  • 软件测试|SQLAlchemy环境安装与基础使用

    简介 SQLAlchemy 是一个强大的 Python 库 用于与关系型数据库进行交互 它提供了高度抽象的对象关系映射 ORM 工具 允许使用 Python 对象来操作数据库 而不必编写原生SQL查询 本文将介绍如何安装 SQLAlchem
  • 【计算机毕业设计】北工国际健身俱乐部

    本系统为会员而设计制作北工国际健身俱乐部 旨在实现北工国际健身俱乐部智能化 现代化管理 本北工国际健身俱乐部管理自动化系统的开发和研制的最终目的是将北工国际健身俱乐部的运作模式从手工记录数据转变为网络信息查询管理 从而为现代管理人员的使用提
  • 2024 人工智能与大数据专业毕业设计(论文)选题指导

    目录 前言 毕设选题 选题迷茫 选题的重要性 更多选题指导 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生
  • Redis分布式锁--java实现

    文章目录 Redis分布式锁 方案 SETNX EXPIRE 基本原理 比较好的实现 会产生四个问题 几种解决原子性的方案
  • MongoDB - 库、集合、文档(操作 + 演示 + 注意事项)

    目录 一 MongoDB 1 1 简介 a MongoDB 是什么 为什么要使用 MongoDB b 应用场景 c MongoDB 这么强大 是不是可以直接代替 MySQL d MongoDB 中的一些概念 e Docker 下载 1 2
  • 使用企业订货软件的担忧与考虑|网上APP订货系统

    使用企业订货软件的担忧与考虑 网上APP订货系统 网上订货系统担心出现的问题 1 如果在订货系统中定错 多 货物了该怎么办 其实这也是很多人在网购或者是现实中经常会犯的一个错误 但是网上订货平台为大家提供了很多的解决方案 其中对于订单的修改
  • 毕业设计:基于python人脸识别系统 LBPH算法 sqlite数据库 (源码)✅

    博主介绍 全网粉丝10W 前互联网大厂软件研发 集结硕博英豪成立工作室 专注于计算机相关专业 毕业设计 项目实战6年之久 选择我们就是选择放心 选择安心毕业 感兴趣的可以先收藏起来 点赞 关注不迷路 毕业设计 2023 2024年计算机毕业
  • 【产品兼容认证】WhaleStudio 成功兼容TiDB数据库软件

    平凯星辰和白鲸开源宣布成功完成产品兼容认证 北京 2023年12月27日 平凯星辰 北京 科技有限公司 以下简称平凯星辰 旗下的 TiDB 产品与白鲸开源的 WhaleStudio 已成功完成产品兼容性认证 这一重要合作旨在为全球客户提供更
  • 两个月进口猛增10倍,买近百台光刻机,难怪ASML不舍中国市场

    据统计数据显示 2023年11月和12月 中国从荷兰进口的光刻机设备同比猛增10倍 进口金额超过19亿美元 让ASML赚得盆满钵满 ASML早前表示中国客户在2023年订购的光刻机全数交付 2023年11月中国进口的光刻机达到42台 进口金
  • 对中国手机作恶的谷歌,印度CEO先后向三星和苹果低头求饶

    日前苹果与谷歌宣布合作 发布了 Find My Device Network 的草案 旨在规范蓝牙追踪器的使用 在以往苹果和谷歌的生态形成鲜明的壁垒 各走各路 如今双方竟然达成合作 发生了什么事 首先是谷歌安卓系统的市场份额显著下滑 数年来
  • Python 使用 NoSQL 数据库的优选方案

    NoSQL 数据库因其高性能 可扩展性和灵活性而风靡一时 然而 对于 Python 程序员而言 选择合适的 NoSQL 数据库可能会令人困惑 因为有多种选择可供选择 那么 哪种 NoSQL 数据库最适合 Python 呢 2 解决方案 根据

随机推荐