我有一个使用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返回,尽可能快地获得一行,就像我使用我的平面文件一样。有什么建议吗?
P.S。我发现这个问题听起来很相似:
Python slow on fetchone, hangs on fetchall
但最终成为一个SQLite问题,我无法控制我的Hive设置。
答案 0 :(得分:1)
您是否考虑过使用fetchmany()。
这将是DBAPI以块为单位提取数据的答案(较大的一个,其中开销是一个问题,并且小于所有行,其中内存是一个问题)。