① Hive學習筆記四:HiveSQL之DDL
本文主要介紹HiveSQL中的數據定義語言(DDL)相關概念,包括創建、修改和刪除資料庫對象的方法。HiveSQL的DDL核心語法主要包括create、alter和drop。
在Hive中,我們可以通過DDL來創建和管理表。表的創建語法通常包含欄位定義和表的存儲格式。Hive支持多種數據類型,包括原生數據類型(數值、時間日期、字元串、雜項數據類型)和復雜數據類型(數組、映射、結構體、聯合類型)。
需要注意的是,Hive支持java數據類型,但在類型不一致時可能會進行隱式轉換,但這種轉換並非總是成功。此外,Hive提供了一個cast函數用於顯式轉換數據類型,轉換失敗時會返回null。
在Hive中,文件讀寫機制依賴於SerDe(序列化器和反序列化器)類。SerDe用於對象和位元組碼之間的轉換,支持使用默認的LazySimpleSerDe類或指定其他SerDe類,甚至允許用戶自定義SerDe類。Hive的row format語法用於指定使用的SerDe類以及分隔符。
Hive默認的存儲路徑可以通過配置文件hive-site.xml中的屬性hive.metastore.warehouse.dir來設置。同時,也可以通過location語法更改數據在HDFS上的存儲路徑。
關於表的創建,常見的實踐包括使用基礎數據類型創建表並上傳數據,使用復雜數據類型創建表以及指定默認分隔符。此外,還可以通過location語法指定數據存儲路徑。
Hive中的表有兩種類型:內部表和外部表。內部表由Hive管理,創建時默認為內部表。內部表的刪除會刪除數據及表的元數據。外部表的數據不是Hive管理的,只管理表的元數據。刪除外部表只會刪除元數據,數據依然存在。外部表結合location語法可以保證數據安全性。
Hive支持分區表和分桶表以優化查詢性能。分區表允許根據特定欄位將數據劃分到不同的分區,可以是靜態分區或動態分區。多重分區表則在原有分區的基礎上繼續分區,形成遞進關系。動態分區的欄位值基於查詢結果自動推斷。分桶表則依據分桶欄位對數據進行分組,有利於減少全表掃描。
Hive的事務表特性允許在處理數據時獲得一致的數據視圖,避免了過多的小文件生成。但事務表僅支持特定條件,並且有其局限性,如不支持回滾操作和僅支持ORC格式。使用事務表時,表參數transactional必須為true,並且表只能是分桶表。
視圖在Hive中被定義為一種虛擬表,不存儲實際數據,只保存查詢定義。視圖可以簡化操作,保護數據隱私,並優化查詢復雜度。在Hive3.0版本中,引入了物化視圖,用於預計算並保存表連接或聚集等耗時操作的結果,以提高查詢性能。
資料庫DDL操作涉及到對資料庫結構的創建、修改和刪除。除了表的DDL操作,Hive還提供了元數據檢查功能,通過msck(metastore check)命令來修復元數據問題。資料庫DDL操作是資料庫管理的基礎,對數據存儲和查詢性能有著重要影響。
② java 驗證字元串是否為sql語句 並且是否包含 select 關鍵字
java驗證字元串是否為sql語句,是否包含select關鍵字,主要使用的是正則表達式來進行驗證,如下:
importjava.util.*;
importjava.text.*;
classsqltest
{
publicstaticvoidmain(String[]args)
{
Stringspan="selectaaaa.idname,hello,typet,hfromdatasaaaa,citybwherea.id=b.idandclike'e%'andnameisnull";
span=span.toUpperCase();//測試用sql語句
System.out.println(span);
Stringcolumn="(\w+\s*(\w+\s*){0,1})";//一列的正則表達式匹配如proctp
Stringcolumns=column+"(,\s*"+column+")*";//多列正則表達式匹配如proctp,categoryc,warehousew
Stringownerenable="((\w+\.){0,1}\w+\s*(\w+\s*){0,1})";//一列的正則表達式匹配如a.proctp
Stringownerenables=ownerenable+"(,\s*"+ownerenable+")*";//多列正則表達式匹配如a.proctp,a.categoryc,b.warehousew
Stringfrom="FROM\s+"+columns;
Stringcondition="(\w+\.){0,1}\w+\s*(=|LIKE|IS)\s*'?(\w+\.){0,1}[\w%]+'?";//條件的正則表達式匹配如a=b或aisb..
Stringconditions=condition+"(\s+(AND|OR)\s*"+condition+"\s*)*";//多個條件匹配如a=bandclike'r%'ordisnull
Stringwhere="(WHERE\s+"+conditions+"){0,1}";
Stringpattern="SELECT\s+(\*|"+ownerenables+"\s+"+from+")\s+"+where+"\s*";//匹配最終sql的正則表達式
System.out.println(pattern);//輸出正則表達式
System.out.println(span.matches(pattern));//是否比配
}
}