Hive 如何快速拉取大批量数据
副问题[/!--empirenews.page--]
用hive来做数仓类操纵,可能大数据的运算,是没有疑问的,至少在你没有更多选择之前。 当我们要hive来做相同于大批量数据的select时,大概题目就会产生了变革。
1. 通用办理方案之分页 起首,我们要基于一个究竟,就是没有哪个数据库可以无穷制的提供我们select恣意数据量的数据。好比常用的 mysql, oracle, 一样平常你select 10w阁下的数据量时已经很是锋利了。而我们的办理要领也较量简朴,那就是分页获取,好比我一页取1w条,直到取完为止。同样,由于hive基于都支持sql92协议,以是你也可以同样的方案去办理大数据量的题目。 分页的办理方案会有什么题目?起首,我们要大白分页是怎样完成的,起首数据库server会按照前提运算出全部或部门切合前提的数据(取决是否有特另外排序),然后再按照分页偏移信息,获取响应的数据。以是,一次次的分页,则一定涉及到一次次的数据运算。这在小数据量的环境下是可以接管的,由于计较机的高速运转手段。可是当数据量大到必然措施时,就不可了。好比我们停滞了很多年的大数据规模办理方案就是很好的证明。 本文基于hive处理赏罚数据,也就是说数据量天然也是大到了必然的级别,那么用分页大概就欠好办理题目了。好比,单次地运算大概就是3-5分钟(基于漫衍式并行计较体系手段),当你要select 100w数据时,假如用一页1w的运算,那么就是100次往返,1次3-5分钟,100次就是5-8小时的时刻,这就完全jj了。谁能等这么长时刻?这样处理赏罚的最终功效就是,营业被砍掉,等着财政结账了。 以是,我们得改变点什么! 2. 行使hive-jdbc jdbc自己不算啥,只是一个毗连协议。但它的甜头在于,可以维持长毗连。这个毗连有个甜头,就是server可以随时输出数据,而client端则可以随时处理赏罚数据。这就给了我们一个机遇,即好比100w的数据运算好之后,server只需绵绵不断的输出功效,而client端则绵绵不断地吸取处理赏罚数据。 以是,我们办理方案是,基于hive-jdbc, 不行使分页,而全量获取数据即可。这给我们带来莫大的甜头,即一次运算即可。好比1次运算3-5分钟,那么总共的运算也就是3-5分钟。 看起来不错,办理了一再运算的题目。恰似万事大吉了。 详细实现就是引入几个hive-jdbc的依靠,然后提交查询,依次获取功效即可。样譬喻下:
org.apache.hive hive-jdbc 2.3.4 -- // 测试hive-jdbc import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.DriverManager; public class HiveJdbcTest { private static Connection conn = getConnnection(); private static PreparedStatement ps; private static ResultSet rs; // 获取全部数据 public static void getAll(String tablename) { String sql="select * from " + tablename; System.out.println(sql); try { ps = prepare(conn, sql); rs = ps.executeQuery(); int columns = rs.getMetaData().getColumnCount(); while(rs.next()) { for(int i=1;i<=columns;i++) { System.out.print(rs.getString(i)); System.out.print(" "); } System.out.println(); } } catch (SQLException e) { e.printStackTrace(); } } // 测试 public static void main(String[] args) { String tablename="t1"; HiveJdbcTest.getAll(tablename); } private static String driverName = "org.apache.hive.jdbc.HiveDriver"; private static String url = "jdbc:hive2://127.0.0.1:10000/"; private static Connection conn; // 毗连hive库 public static Connection getConnnection() { try { Class.forName(driverName); conn = DriverManager.getConnection(url, "hive", "123"); } catch(ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } public static PreparedStatement prepare(Connection conn, String sql) { PreparedStatement ps = null; try { ps = conn.prepareStatement(sql); } catch (SQLException e) { e.printStackTrace(); } return ps; } } 样例代码,无需纠结。简朴的jdbc操纵样板。总体来说就是,不带分页的吸取全量数据。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |