加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Hive 如何快速拉取大批量数据

发布时间:2020-11-08 21:16:32 所属栏目:建站 来源:网络整理
导读:用hive来做数仓类操纵,可能大数据的运算,是没有疑问的,至少在你没有更多选择之前。 当我们要hive来做相同于大批量数据的select时,大概题目就会产生了变革。 1. 通用办理方案之分页 起首,我们要基于一个究竟,就是没有哪个数据库可以无穷制的提供我们s
副问题[/!--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操纵样板。总体来说就是,不带分页的吸取全量数据。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读