Python/Hive接口在fetchone()时慢,在fetchall()时挂起

7 投票
1 回答
1925 浏览
提问于 2025-04-18 16:52

我有一个Python脚本,它通过pyhs2在查询HiveServer2,代码大概是这样的:

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在fetchone时慢,fetchall时卡住

但那是SQLite的问题,而我对我的Hive设置没有控制权。

1 个回答

1

你有没有考虑过使用fetchmany()呢?

这个方法是数据库API中用来分批获取数据的解决方案。它可以一次获取一部分数据,这样可以避免一次性加载太多数据导致的性能问题,也不会占用太多内存。

撰写回答