Python/Hive 接口(interface)使用 fetchone() 速度慢,使用 fetchall() 挂起

标签 python hive

我有一个使用 pyhs2 查询 HiveServer2 的 python 脚本,如下所示:

import pyhs2;
conn = pyhs2.connect(host=localhost,
               port=10000,
               user='user',
               password='password',
               database='default');

cur = conn.cursor();
cur.execute("SELECT name,data,number,time FROM table WHERE date = '2014-01-01' AND number in (1,5,6,22) ORDER BY name,time ASC");

line = cur.fetchone();
while line is not None:
   <do some processing, including writing to stdout>
   .
   .
   .
   line = cur.fetchone();

我也尝试过使用 fetchall() 而不是 fetchone(),但它似乎永远挂起。

我的查询运行良好并返回了约 2.7 亿行。为了进行测试,我将 Hive 的输出转储到一个以制表符分隔的平面文件中,并针对它编写了我的 python 脚本的内容,这样我就不必在每次运行时都等待查询完成。我读取平面文件的脚本将在大约 20 分钟内完成。令我困惑的是,当我直接查询 Hive 时,我看不到相同的性能。事实上,完成处理需要大约 5 倍的时间。我对 Hive 和 python 还很陌生,所以也许我犯了一些愚蠢的错误,但我在网上看到的例子显示了这样的设置。我只想遍历我的 Hive 返回,尽可能快地一次获取一行,就像我使用我的平面文件一样。有什么建议吗?

附言我发现这个问题听起来很相似:

Python slow on fetchone, hangs on fetchall

但这最终成为一个 SQLite 问题,我无法控制我的 Hive 设置。

最佳答案

您是否考虑过使用 fetchmany()。

这将是 DBAPI 以 block 的形式提取数据的答案(更大的 block ,开销是一个问题,小于所有行,内存是一个问题)。

关于Python/Hive 接口(interface)使用 fetchone() 速度慢,使用 fetchall() 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25248466/

相关文章:

python - 使用 Tastypie 公开模型方法

python - 在 OSX Lion 上强加链接到特定的 python 库

Hive FROM_UNIXTIME() 以毫秒为单位

python - json.dumps 打乱了顺序

python - Tkinter 将带参数的函数绑定(bind)到小部件

hadoop - 如何在没有标题和非表格形式的情况下打印配置单元直线输出

hadoop - 将数据加载到配置单元中时,删除字段中的引号

hadoop - 为了加快配置单元进程,如何使用 tez 调整映射器和缩减器数量

csv - Hive:可以将CSV文件加载到Hive表中的Shell脚本吗?

python - 如何使用 Docker 容器作为 virtualenv 从 IDE 运行 Python 测试?