⑴ 求助,sql語句無法用到索引,執行很慢
HiveStorageHandler,然後在hive中創建一個oracle的表(如果oracle中表已存在則創建外部表),再創建一個HBase表。
然後然後通過HQL執行導入過程。
⑵ hibernate的三種查詢方式
1.1、SQL概述
HQL是Hibernate Query Language的縮寫,提供更加豐富靈活、更為強大的查詢能力;HQL接近SQL`語句查詢語法。
完整的HQL語句形式如下:
select | update | delete … from … where … group by … having … order by … asc|desc
其中的update、delete為Hibernate3中所新添加的功能,可見HQL查詢非常類似於標准SQL查詢。HQL查詢在整個Hibernate實體操作體系中占核心地位。
String hql = "HQL語句";
Query query = session.createQuery(hql);
List list = query.list(); //查詢得到多個實體對象集合
Object result = query.uniqueResult(); //查詢得到一個實體對象
int x = query.executeUpdate(); //執行update或delete語句,返回數據表受影響行數
1.2、實體查詢
查詢過程中表名使用類名,列名使用屬性名,類名和屬性名稱區分大小寫
String hql="from Users";//from 實體類類型名稱
Query query = session.createQuery(hql);
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
1.3、帶where的查詢
Query query = session.createQuery("from Users where uid=3");
Users user = (Users) query.uniqueResult();//uniqueResult 單一對象
System.out.println(user);
Query query = session.createQuery("from Users where uid>5");
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
1.3、屬性查詢
查詢部分屬性
String hql="select u.uid,u.uname,u.upwd from Users u where u.uname='張三'";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
String hql="select new Users(u.uname,u.upwd) from Users u where u.uname='張三'";
Query query = session.createQuery(hql);
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
1.4、實體的更新和刪除
從hibernate 3版本開始才支持
//更新
String hql="update Users set uname='王五',upwd='321' where uid=3";
int res = session.createQuery(hql).executeUpdate();
//刪除
String hql="delete from Users where uid=3";
int res = session.createQuery(hql).executeUpdate();
/*
返回值結果:
正整數:表受影響的行數據
0: 語句正常執行,但沒有行受影響
負整數:通常是-1,執行HQL語句是一條查詢語句
*/
HQL語句不能做添加
1.5、分組與排序
排序
處理方式和SQL語句中的排序是一樣的
String hql="from Users order by uid";
Query query = session.createQuery(hql);
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
order by語句只能出現在語句的最後位置
分組
處理方式和SQL語句中分組查詢相同
分組語句需要處理篩選,只能使用having語句,而不能使用where語句。
String hql = "select e.dept.deptno, count(e) from Emp e group by dept.deptno";
String hql = "select e.dept.deptno, count(e) from Emp e group by dept.deptno having count(e)>=5";
1.6、參數綁定
使用佔位參數
String hql="from Users where uid=? or uname=?";
Query query = session.createQuery(hql);
//索引從0開始
query.setInteger(0, 3);//query.setParameter(0, 3);
query.setString(1, "張三");//query.setParameter(1, "張三");
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
使用參數名稱
String hql = "from Users where uid=:no1 or uid=:no2";
Query query = session.createQuery(hql);
query.setInteger("no1", 1);
query.setInteger("no2", 3);
//....
可以使用點位參數和名稱參數混合使用
String hql = "from User where uid=? or uid=:no2";
Query query = session.createQuery(hql);
query.setInteger(0, 7788);
query.setInteger("no2", 7566);
//....
//使用點位參數和名稱參數混合使用,所有點位參數必須放在前面,一旦有名稱參數出現,其後將不能再出現佔位參數
1.7、連接查詢
--SQL語句:查詢員工姓名、薪資、部門名稱
SELECT ENAME,SAL,DNAME
FROM EMP e JOIN DEPT d ON e.DEPTNO=d.DEPTNO
SELECT ENAME,SAL,DNAME FROM EMP,DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO
沒有on語句
能被連接到查詢中的必須是主查詢對象的子屬性
String hql="SELECT e.ename, e.sal, e.dept.dname FROM Emp e";
//HQL連接查詢
String hql="SELECT e.ename, e.sal, d.dname FROM Emp e JOIN e.dept d";
String hql = "SELECT e FROM Emp e JOIN e.dept"; //JOIN將沒有意義
String hql = "FROM Emp e JOIN e.dept";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
//List集合中的數組中會保存兩個元素:
//0:主數據(Emp)
//1:從數據(Dept)
//查詢編號為7788的員工信息,同時將對應的dept信息和manager信息查詢並保存在對應的子屬性中
String hql = "FROM Emp e JOIN FETCH e.dept d JOIN FETCH e.manager m WHERE e.empno=7788";
Query query = session.createQuery(hql);
Emp emp = (Emp) query.uniqueResult();
System.out.println(emp);
System.out.println(emp.getManager());
System.out.println(emp.getDept());
1.8、分頁
String hql = "from Users";
Query query = session.createQuery(hql);
query.setFirstResult(0);
query.setMaxResults(2);
2、QBC查詢
QBC(Query By Criteria)查詢就是通過使用Hibernate提供的Query By Criteria API來查詢對象,這種API封裝了SQL語句的動態拼裝,對查詢提供了更加面向對象的功能介面。
QBC查詢最重要的三個類:
Restrictions 條件限制
Projections 列設射
Order 排序
2.1、查詢實現
Criteria criteria = session.createCriteria(Users.class);
//session.createCriteria("entity.Users");
//session.createCriteria(Users.class, "別名");
List<Dept> list = criteria.list();
//查詢單行結果(如果結果有兩行或更多,會報錯)
Object uniqueResult = criteria.uniqueResult();
2.2、Projections 列投射
語法:
//查詢uname屬性
Criteria criteria = session.createCriteria(Users.class);
PropertyProjection property = Projections.property("name");
criteria.setProjection(property);
List<Object> result = criteria.list();
//查詢uname, upwd屬性
Criteria criteria = session.createCriteria(Users.class);
//1.創建投射列表
ProjectionList projectionList = Projections.projectionList();
//2.向投射列表中添加列投射
PropertyProjection property1 = Projections.property("uname");
PropertyProjection property2 = Projections.property("upwd");
projectionList.add(property1).add(property2);
//3.將投射列表設置到准則中
criteria.setProjection(projectionList);
List<Object> result = criteria.list();
返回值類型 方法名稱 描述
PropertyProjection Projections.property 指定某屬性
AggregateProjection Projections.avg 求平均值
CountProjection Projections.count 統計某屬性的數量
CountProjection Projections.countDistinct 統計某屬性不同值的數量
PropertyProjection Projections.groupProperty 指定某個屬性為分組屬性
AggregateProjection Projections.max 求最大值
AggregateProjection Projections.min 求最小值
ProjectionList Projections.projectionList 創建一個ProjectionList對象
Projection Projections.rowCount 查詢結果集中的記錄條數
AggregateProjection Projections.sum 求某屬性的合計
2.3、Restrictions 條件限制
語法:
Criteria criteria = session.createCriteria(Users.class);
Criterion notNull = Restrictions.isNotNull("comm");
criteria.add(notNull); //添加一個條件(如果添加了多個條件,默認條件之間使用and連接)
List<Users> list = criteria.list();
返回值類型 方法名稱 描述
SimpleExpression Restrictions.eq 等於(equal)
Criterion Restrictions.allEq 使用Map,Key/Valu進行多個等於的比對
SimpleExpression Restrictions.gt 大於(great than)
SimpleExpression Restrictions.ge 大於等於(great than or equal)
SimpleExpression Restrictions.lt 小於(less than)
SimpleExpression Restrictions.le 小於等於(less than or equal)
Criterion Restrictions.between 對應SQL的between
SimpleExpression Restrictions.like 對應SQL的like
Criterion Restrictions.in 對應SQL的in
LogicalExpression Restrictions.and and關系
LogicalExpression Restrictions.or or關系
Criterion Restrictions.isNull 為空
Criterion Restrictions.sqlRestriction SQL限定查詢
Criterion Restrictions.not 取反
2.3、Order排序
語法:
Criteria criteria = session.createCriteria(Dept.class);
criteria.addOrder(Order.asc("name"))
.addOrder(Order.desc("loc"));
//SELECT * FROM DEPT ORDER BY name ASC, loc DESC
返回值類型 方法名稱 描述
Order Order.asc(String propertyName) 升序
Order Order.desc(String propertyName) 降序
2.4、分頁查詢
Criteria criteria = session.createCriteria(Dept.class);
int pageNum = 2, pageSize = 5;
criteria.setFirstResult((pageNum-1)*pageSize); //查詢起始行下標
criteria.setMaxResults(pageSize); //查詢的最大行數
List list = criteria.list();
//setFirstResult方法和setMaxResults方法同樣可以在SQLQuery及Query類型上使用
3、原生SQL查詢
1、查詢
String sql = "select uid,uname,upwd from _users";
List list = session.createSQLQuery(sql).list();
for(Object obj : list){
System.out.println(obj);
}
2、 addEntity()
String sql = "select uid,uname,upwd from _users";
// addEntity()可以告訴Hibernate你想要封裝成對象的類型,然後自動為你封裝
SQLQuery query = session.createSQLQuery(sql).addEntity(Users.class);
List<User> list = query.list();
for(Users user : list){
System.out.println(user.getUname());
}
3、 uniqueResult
String sql = "select uid,uname,upwd from _users where uid = 2";
SQLQuery query = session.createSQLQuery(sql).addEntity(Users.class);
Users user = (Users) query.uniqueResult();//返回單一對象
System.out.println(user.getUname());
USB Microphone https://www.soft-voice.com/
Wooden Speakers https://www.zeshuiplatform.com/
亞馬遜測評 www.yisuping.cn
深圳網站建設www.sz886.com
⑶ 資料庫裡面mysql和hive區別是什麼
1.查詢語言不同:hql/sql
2.數據存儲位置不同:hdfs/資料庫系統
3.數據格式:可自定義/資料庫系統定義格式
4.數據更新:Hive不支持數據更新/mysql支持數據更新update
⑷ HQL怎麼查子查詢的條數
子查詢是SQL語句中非常重要世悔的功能特性,它可以在SQL語句中利用另外一條SQL語句的查詢結果,在Hibernate中HQL查詢同樣對子查詢功能提供稿返衡了支持。如下面代碼所示:
List list=session.createQuery(「from Customer c where 1>(select count(o) from c.orders o)」).list();
上面的程序查詢訂單數超過1的所有客戶,因此和上面子查詢HQL語句對應的SQL語句為:
Select * from Customer c where 1>(select count(o.id) from Order o where c.id=o.customer_ID);
如果子查詢返回多條記錄,則可以使用下面關鍵字:
all:表示子查詢語句返回的所有記錄
any:表示子查詢語句返回的任意一條結果
some:與」any」等價
in:與」=any」等價
exists:表示子查詢語句至少返回一條記錄
例如:查詢存在一條訂單價格大於100的客戶
From Customer c where 100>any(select o.price from c.orders o);
如果在子查詢中操作集合,HQL提供鍵做了一組操縱集合的函數和屬性:
size()函數和size屬性:獲得集合中元素的數量
minIndex()函數和minIndex屬性:對於建立了索引的集合獲得最小索引值(關於集合索引參考第一部分映射值類型集合)
minElement()函數和minElement屬性:對於包含基本類型的元素集合,獲得集合中值最小的元素
maxElement()函數和maxElement屬性:對於包含基本類型元素的集合,獲得集合中值最大的元素
element()函數:獲得集合中所有元素
例如:查詢訂單數大於0的客戶
From Customer c where size(c.orders)>0;或者From Customer c where c.orders.size>0;
以上HQL語句會生成類似如下的SQL語句:
Select * from customer c where 0>(select count(o.id) from order where o. customer_ID =c.id);
⑸ hive獲取多個分區表的數據與其他資料庫有什麼異同
1.
查詢語言。由於 SQL 被廣泛的應用在數據倉庫中,因此,專門針對 Hive 的特性設計了類 SQL 的查詢語言 HQL。熟悉 SQL 開發的開發者可以很方便的使用 Hive 進行開發。
2. 數據存儲位置。Hive 是建立在 Hadoop 之上的,所有 Hive 的數據都是存儲在 HDFS 中的。而資料庫
則可以將數據保存在本地文件系統中。
3. 數據格式。Hive 中沒有定義專門的數據格式,數據格式可以由用戶指定,用戶定義數據格式需要指定三
個屬性:列分隔符(通常為空格、」\t」、」\x001″)、行分隔符(」\n」)以及讀取文件數據的方法(Hive 中默認有三個文件格式 TextFile,SequenceFile 以及 RCFile)。由於在載入數據的過程中,不需要從用戶數據格式到 Hive 定義的數據格式的轉換,因此,Hive 在載入的過程中不會對數據本身進行任何修改,而只是將數據內容復制或者移動到相應的 HDFS 目錄中。而在資料庫中,不同的資料庫有不同的存儲引擎,定義了自己的數據格式。所有數據都會按照一定的組織存儲,因此,資料庫載入數據的過程會比較耗時。
4. 數據更新。由於 Hive 是針對數據倉庫應用設計的,而數據倉庫的內容是讀多寫少的。因此,Hive 中不
支持對數據的改寫和添加,所有的數據都是在載入的時候中確定好的。而資料庫中的數據通常是需要經常進行修改的,因此可以使用 INSERT INTO ... VALUES 添加數據,使用 UPDATE ...
SET 修改數據。
5. 索引。之前已經說過,Hive 在載入數據的過程中不會對數據進行任何處理,甚至不會對數據進行掃描,
因此也沒有對數據中的某些 Key 建立索引。Hive 要訪問數據中滿足條件的特定值時,需要暴力掃描整個數據,因此訪問延遲較高。由於 MapRece 的引入, Hive 可以並行訪問數據,因此即使沒有索引,對於大數據量的訪問,Hive 仍然可以體現出優勢。資料庫中,通常會針對一個或者幾個列建立索引,因此對於少量的特定條件的數據的訪問,資料庫可以有很高的效率,較低的延遲。由於數據的訪問延遲較高,決定了 Hive 不適合在線數據查詢。
6. 執行。Hive 中大多數查詢的執行是通過 Hadoop 提供的 MapRece 來實現的(類似 select * from tbl
的查詢不需要 MapRece)。而資料庫通常有自己的執行引擎。
7. 執行延遲。之前提到,Hive 在查詢數據的時候,由於沒有索引,需要掃描整個表,因此延遲較高。另外
一個導致 Hive 執行延遲高的因素是 MapRece 框架。由於 MapRece 本身具有較高的延遲,因此在利用 MapRece 執行 Hive 查詢時,也會有較高的延遲。相對的,資料庫的執行延遲較低。當然,這個低是有條件的,即數據規模較小,當數據規模大到超過資料庫的處理能力的時候,Hive 的並行計算顯然能體現出優勢。
8. 可擴展性。由於 Hive 是建立在 Hadoop 之上的,因此 Hive 的可擴展性是和 Hadoop 的可擴展性是
一致的(世界上最大的 Hadoop 集群在 Yahoo!,2009年的規模在 4000 台節點左右)。而資料庫由於 ACID 語義的嚴格限制,擴展行非常有限。目前最先進的並行資料庫 Oracle 在理論上的擴展能力也只有 100 台左右。
9. 數據規模。由於 Hive 建立在集群上並可以利用 MapRece 進行並行計算,因此可以支持很大規模的
數據;對應的,資料庫可以支持的數據規模較小。