python - 有没有办法用 Python 加速 Hive 查询
问题描述
我目前正在使用Pyhive
连接到我们Hiveserver2
的由Kerberos
.
conn = hive.Connection(host=HIVE_HOST,
port=HIVE_PORT,
database=HIVE_DB,
auth='KERBEROS',
kerberos_service_name="hive")
我主要使用以下查询从该表中读取数百个标签的时间序列数据(10 秒间隔):
sql = """
select dt,
max(case when tag_id = 'tag1' then val end) as tag1,
max(case when tag_id = 'tag2' then val end) as tag2,
max(case when tag_id = 'tag3' then val end) as tag3,
max(case when tag_id = 'tag4' then val end) as tag4,
.....
.....
from (
select tag_id,
cast(concat(year_mon_day,' ',lpad(hour_val,2,'0'),':',lpad(minute_val,2,'0'),
':',lpad(second_val,2,'0')) as timestamp) dt,
val
from tag_data
where cast(year_mon_day) as date) >= '2018-09-01'
and cast(year_mon_day) as date) < '2018-09-15'
) sub
group by dt
"""
cur = conn.cursor()
cur.execute(sql)
results = cur.fetchall()
此查询大约需要 40 分钟才能返回约 100,000 行和 400 多列。这只是 15 天的数据。最终,我们需要一次提取数月或数年的数据来进行机器学习。
我想知道是否有一种方法可以加快pyhive
查询速度。我知道它sqlalchemy
在后台,但是查询是否根据可用资源并行运行?我们有一个非常好的 HPC 资源可供使用。我怎样才能更快地运行它?
我应该使用PySpark
并运行SparkSQL
查询吗?但是我似乎无法找到如何使用 PySpark 连接到 hive2+kerberos。
解决方案
推荐阅读
- php - 如何在 O(1) 时间内不向数组添加重复项
- c - 为什么不能在 c 中初始化 main() 之外的结构值?
- angular - 如何订阅从 ngrx 的实体数据服务返回的 Observable
- reactjs - 如何重构此代码以减少重复?
- ruby-on-rails - 如何使用 devise gem 找到 Rails 应用程序的 true_user 定义?
- python - 使用 Python 和 Selenium 抓取 Bet365 赔率的问题
- javascript - 为什么我的 React Router 组件采用了错误的样式?
- dart - 在 Dart 的可选参数构造函数中使用构造函数初始化成员
- android - 该文件在设备上的什么位置?
- java - 通过在 lambda 中包含某个字符来对数组中的字符串进行排序——使用 contains?