热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【tkGo】使用Python连接Impala

一、背景使用Python,打通Impala通道,实现取数自动化,或是作为数据分析的数据源。二、ApacheImpalaImpala是一

一、背景

使用Python,打通Impala通道,实现取数自动化,或是作为数据分析的数据源。


二、Apache Impala

Impala是一个开源的,基于Hadoop的分析型数据库。

Impala可以查询存储在HDFS或者HBase中的数据。

Impala通过专用分布式查询引擎,绕过MapReduce直接访问数据,查询性能远高于Hive。


三、impyla

基于HiveServer2 实现的分布式查询引擎(如Impala、Hive)的Python客户端。

完全符合DB API 2.0(PEP 249)规范。

使用Kerberos、LDAP、SSL。

支持将数据转换为pandas的DataFrame,轻松集成到Python数据栈(如scikit-learn、matplotlib等)。


四、类封装

from impala.dbapi import connect
from impala.error import ProgrammingError
from utils.db.sql import SQLclass Impala(SQL):DESC_EXEC_SUCCESS = "执行成功"def __init__(self, host, port, database, user, password=None):"""Impala工具类:param host: IP:param port: 端口:param database: 数据库名:param user: 用户名:param password: 密码"""self.host = hostself.port = portself.database = databaseself.user = userself.password = passwordself.cOnnect= Noneself.cursor = Nonedef get_connect(self, timeout=600):"""获取连接:param timeout: 超时时间"""self.cOnnect= connect(host=self.host, # IP port=self.port, # 端口timeout=timeout, # 超时时间database=self.database # 数据库名)def get_cursor(self):"""获取游标"""self.cursor = self.connect.cursor(user=self.user # 用户名)def close(self):"""关闭连接"""self.cursor.close()self.connect.close()self.cursor = Noneself.cOnnect= Nonedef execute(self, sql, auto_close=True):"""执行sql:param auto_close: 执行结束是否自动关闭连接"""if not self.connect: self.get_connect()if not self.cursor: self.get_cursor()self.cursor.execute(sql)try:result = self.cursor.fetchall()except ProgrammingError:result = self.DESC_EXEC_SUCCESSif auto_close: self.close()return result

五、使用例子

from utils.db.impala import Impalaimpala = Impala(host="10.123.0.11",port=123456,database="fields",user="unclebean"
)
sql = "select 1 as a, 2 as b union all select 3 as a, 4 as b"
result = impala.execute(sql, auto_close=True)
print(result)

默认的返回结果是一个列表,列表中每个元素代表一行结果,类型为元组,如上面返回的结果:[(1, 2), (3, 4)]

若想行结果变为字典,而非元组,则获取游标时需传入参数dictify=True,如

sql = "select 1 as a, 2 as b union all select 3 as a, 4 as b"
result = impala.execute(sql, auto_close=True, dictify=True)
print(result)

则返回结果变为:[{'a': 1, 'b': 2}, {'a': 3, 'b': 4}]


六、tkinter封装,实现一键刷新元数据和按日统计数据量

import os
from datetime import datetime
from menu.menu import EMenu
from utils.db.impala import Impalaclass MenuImpala(EMenu):LABEL_NAME = "Impala"LABEL_NAME_INVALIDATE_METADATA = "Invalidate Metadata"LABEL_NAME_COUNT_BY_DAY = "Count By Day"DESC_SSH_CMD_FAILED = "执行错误"def __init__(self, master=None, cnf={}, **kw):super().__init__(master=master, cnf=cnf, **kw)self.impala = Impala(host = self.conf.impala.HOST,port = self.conf.impala.PORT,database = self.conf.impala.DATABASE,user = self.conf.impala.USER)master.add_cascade(label=self.LABEL_NAME, menu=self) # 添加主菜单self.add_command( # 添加子菜单-刷新元数据label=self.LABEL_NAME_INVALIDATE_METADATA, command=self.invalidate_metadata)self.add_command( # 添加子菜单-按日统计数据量label=self.LABEL_NAME_COUNT_BY_DAY, command=self.count_by_day)@EMenu.thread_run(LABEL_NAME_COUNT_BY_DAY)def count_by_day(self):"""菜单命令:按日统计数据量"""table_name = self.get_table_name_from_clip() # 从剪贴板中获取表名self.invalidate_table(table_name, auto_close=False) # 先刷新元数据sql = "select data_date,count(1) from {} group by data_date order by data_date desc".format(table_name)self.stdout(sql, with_time=" - ")result = self.impala.execute(sql) # 再按日统计数据量result = "\n".join([str(row) for row in result])self.stdout("{} -> {}".format(sql, result), with_time=" - ")self.msg_box_info(result)@EMenu.thread_run(LABEL_NAME_INVALIDATE_METADATA)def invalidate_metadata(self):"""菜单命令:刷新元数据"""self.invalidate_table(self.get_table_name_from_clip()) # 从剪贴板中获取表名,然后刷新元数据def invalidate_table(self, table_name, auto_close=True):sql = "invalidate metadata {}".format(table_name)self.stdout(sql, with_time=" - ")result = self.impala.execute(sql=sql, auto_close=auto_close)self.stdout("{} -> {}".format(sql, result), with_time=" - ")def get_table_name_from_clip(self):table_name = self.paste()if len(table_name.split(".")) == 1: table_name = table_name.split("_")[0] + "." + table_namereturn table_name


七、完整代码

GitHub上搜索TheUncleWhoGrowsBeans


推荐阅读
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • 2016-2017学年《网络安全实战》第三次作业
    2016-2017学年《网络安全实战》第三次作业总结了教材中关于网络信息收集技术的内容。本章主要探讨了网络踩点、网络扫描和网络查点三个关键步骤。其中,网络踩点旨在通过公开渠道收集目标信息,为后续的安全测试奠定基础,而不涉及实际的入侵行为。 ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • Python 数据分析领域不仅拥有高质量的开发环境,还提供了众多功能强大的第三方库。本文将介绍六个关键步骤,帮助读者掌握 Python 数据分析的核心技能,并深入探讨六款虽不广为人知但却极具潜力的数据处理库,如 Pandas 的替代品和新兴的可视化工具,助力数据科学家和分析师提升工作效率。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • 在CentOS 7上部署WebRTC网关Janus
    在CentOS 7上部署WebRTC网关Janus ... [详细]
author-avatar
澄墙_168
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有