把hdfs文件和hive表建立關聯。以此可以保證,在對hive表做操作的時候,可以由hive轉換成操作表對應的HDFS文件
1.自定義分隔符
# 分隔符設計
下面的自定義分割符對應的數據示例
101,zhangsan,25,13676910861-1366666666,62.|農業銀行-58.|建設銀行,河南省-鄭州市-金水區
int, string ,int,array , map ,struct
分隔符 | 含義 |
---|---|
, | 用來表示每個列的值之間分隔符。 fields |
- | 用來分割array中每個元素,以及struct中的每個值,以及map中kv與kv之間。 collection items |
豎線 | 用來分割map的k和v之間 map keys |
\n | 每條數據分割使用換行。 lines |
建表
create table t_person(
id string,
name string,
salary double,
birthday date,
sex char(1),
hobbies array<string>,
cards map<string,string>,
addr struct<city:string,zipCode:string>
) row format delimited
fields terminated by ','--列的分割
collection items terminated by '-'--數組 struct的屬性 map的kv和kv之間
map keys terminated by '|'-- map的k與v的分割
lines terminated by '\n';--行數據之間的分割
測試數據
1,張三,8000.0,2019-9-9,1,抽煙-喝酒-燙頭,123456|中國銀行-22334455|建設銀行,北京-10010
2,李四,9000.0,2019-8-9,0,抽煙-喝酒-燙頭,123456|中國銀行-22334455|建設銀行,鄭州-45000
3,王五,7000.0,2019-7-9,1,喝酒-燙頭,123456|中國銀行-22334455|建設銀行,北京-10010
4,趙6,100.0,2019-10-9,0,抽煙-燙頭,123456|中國銀行-22334455|建設銀行,鄭州-45000
5,於謙,1000.0,2019-10-9,0,抽煙-喝酒,123456|中國銀行-22334455|建設銀行,北京-10010
6,郭德綱,1000.0,2019-10-9,1,抽煙-燙頭,123456|中國銀行-22334455|建設銀行,天津-20010
導入數據
# 在hive命令行中執行
-- local 代表本地路徑,如果不寫,代表讀取文件來自於HDFS
-- overwrite 是覆蓋的意思,可以省略。
load data [local] inpath ‘/opt/datas/person.txt’ [overwrite] into table t_person;
# 本質上就是將數據上傳到hdfs中(數據是受hive的管理)
2.JSON分割符:要導入的數據是json格式
JSON格式
* 基本:{name:value,name:value,....}
* 數組相關的json格式:[元素1,元素2,....]
# 在hive的客戶端執行(臨時添加jar到hive的classpath,有效期本鏈接內)
add jar /opt/installs/hive1.2.1/hcatalog/share/hcatalog/hive-hcatalog-core-1.2.1.jar;
# 補充:永久添加,Hive服務器級別有效。
1. 將需要添加到hive的classpath的jar,拷貝到hive下的auxlib目錄下,
2. 重啟hiveserver即可。
測試數據
{"id":1,"name":"zhangsan","sex":0,"birth":"1991-02-08"}
{"id":2,"name":"lisi","sex":1,"birth":"1991-02-08"}
建表
create table t_person2(
id string,
name string,
sex char(1),
birth date
)row format serde 'org.apache.hive.hcatalog.data.JsonSerDe';
加載文件數據(本地客戶端命令)
# 注意:導入的json數據dbeaver看不了。(因為導入后的表本質上就是該json文件。)
load data local inpath '/opt/data/person.json'(文件路徑) into table t_person2;(表名)
注意:保證json文件中的key的名字和數據庫中表的字段名一樣
3. 正則分隔符
通過正則表達式把數據進行切分
借助於正則表達式在線工具完成正則表達式的定義
數據
INFO 192.168.1.1 2019-10-19 QQ com.baizhi.service.IUserService#login
INFO 192.168.1.1 2019-10-19 QQ com.baizhi.service.IUserService#login
ERROR 192.168.1.3 2019-10-19 QQ com.baizhi.service.IUserService#save
WARN 192.168.1.2 2019-10-19 QQ com.baizhi.service.IUserService#login
DEBUG 192.168.1.3 2019-10-19 QQ com.baizhi.service.IUserService#login
ERROR 192.168.1.1 2019-10-19 QQ com.baizhi.service.IUserService#register
建表語句
create table t_access(
level string,
ip string,
log_time date,
app string,
service string,
method string
)row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'--正則表達式的格式轉化類
with serdeproperties("input.regex"="(.*)\\s(.*)\\s(.*)\\s(.*)\\s(.*)#(.*)");--(.*) 表示任意字符 \\s表示空格
導入數據
load data local inpath '/opt/data/access.log' into table t_access;