-連接sparksql: cd /home/mr/spark/bin ./beeline !connect jdbc:hive2://hostname:port --切換數據庫
use databaseName; --建表:
create table tab_test( name string, age int, num1 double, num2 bigint, msg varchar(80) --最后一個字段后面不能有 ',' 號
) partitioned by (p_age int,p_name string) --分區信息
row format delimited fields terminated by ',' --數據中,屬性間用逗號分隔
stored as textfile location '/tab/test/tab_test'; --保存路徑,最后也可帶'/' 即寫成 '/tab/test/tab_test/'
-- stored as orc ;orc類型的表,手動推數據(txt / csv 文件;無需表頭,行尾無需',',數據文件保存為unix utf-8 無bom格式)不行; --可以借助textfile類型的臨時表插入數據;插入時,要注意字段順序對應一致。 --指定分區,追加插入;最好不要用 'seletc * ' 表字段變化時,*指代的內容不一樣
insert into table tab_test_orc partition(p_age=10,p_name='lucy') select name,age,num1,num2,msg from tab_test_temp; --指定分區,覆蓋插入
insert overwrite table tab_test_orc partition(p_age=10,p_name='lucy') select name,age,num1,num2,msg from tab_test_temp; 查看表字段、結構: select * from tab_test; --分區字段也會被選出來
+-------+------+-------+-------+------+--------+---------+
| name | age | num1 | num2 | msg | p_age | p_name |
+-------+------+-------+-------+------+--------+---------+
+-------+------+-------+-------+------+--------+---------+
desc tab_test; 0: jdbc:hive2://vmax32:18000> desc tab_test; +--------------------------+--------------+----------+
| col_name | data_type | comment |
+--------------------------+--------------+----------+
| name | string | NULL |
| age | int | NULL |
| num1 | double | NULL |
| num2 | bigint | NULL |
| msg | varchar(80) | NULL |
| p_age | int | NULL |
| p_name | string | NULL |
| # Partition Information | | |
| # col_name | data_type | comment |
| p_age | int | NULL |
| p_name | string | NULL |
+--------------------------+--------------+----------+
desc formatted tab_test; --更詳細地查看表結構;hdfs保存位置
+------------------------------------------------------------------------------------+
| result |
+------------------------------------------------------------------------------------+
| # col_name data_type comment |
| |
| name string |
| age int |
| num1 double |
| num2 bigint |
| msg varchar(80) |
| |
| # Partition Information |
| # col_name data_type comment |
| |
| p_age int |
| p_name string |
| |
| # Detailed Table Information |
| Database: zxvmax |
| Owner: mr |
| CreateTime: Fri Aug 12 11:02:35 CST 2016 |
| LastAccessTime: UNKNOWN |
| Protect Mode: None |
| Retention: 0 |
| Location: hdfs://vmax53:9000/tab/test/tab_test |
| Table Type: MANAGED_TABLE |
| Table Parameters: |
| transient_lastDdlTime 1470970955 |
| |
| # Storage Information |
| SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe |
| InputFormat: org.apache.hadoop.mapred.TextInputFormat |
| OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat |
| Compressed: No |
| Num Buckets: -1 |
| Bucket Columns: [] |
| Sort Columns: [] |
| Storage Desc Params: |
| field.delim , |
| serialization.format , |
+------------------------------------------------------------------------------------+
37 rows selected (0.12 seconds) --刪表:
drop table if exists tab_test; --該表分區也會被刪除
--刪表中數據:
truncate table tab_test; --執行后,分區依然存在
truncate table tab_test partition(p_age=10,p_name='Tom'); --刪除某分區
--增加分區:
更完善寫法: alter table tab_test add if not exists partition(p_age=11,p_name="Tom"); alter table tab_test add partition(p_age=10,p_name='Tom'); --需要指定所有的分區,不能只是p_age或p_name;否則org.apache.spark.sql.execution.QueryExecutionException:doesn't contain all (2) partition columns --查看分區: show partitions tab_test;
0: jdbc:hive2://vmax32:18000> show partitions tab_test; +----------------------+ | result | +----------------------+ |
p_age=10/p_name=Tom | +----------------------+ 1 row selected (0.083 seconds) --刪除分區
alter table tab_test drop if exists partition(p_age=10); --刪除分區時,可以只指定局部
alter table tab_test drop partition(p_name='Tom'); --只執行該條語句,p_age=10分區連同一起被刪掉,show partitions 結果為空;hdfs dfs -ls 也看不到 p_age=10的分區
alter table tab_test add partition(p_age=10,p_name='cat'); --只drop p_name='Tome', p_name='cat' 的分區還存在,show partitions 可以查到
--動態分區;動態分區匹配最后選出的字段;只與字段順序有關系,與名字無關;同時存在靜態和動態分區,動態分區必須在靜態分區之后
insert into table tab_test(p_age,p_name) select name, age, num1, num2, msg, age as pppp_age, --取不取別名都可以;分區需要出現在select出來的字段的最后位置,為了匹配。
name as p_name --寫個對應的別名,看上去好理解一點
from tab_test_temp; 附hdfs相關操作命令: --切換到hdfs用戶
su hdfs --查看hdfs下文件或目錄
hdfs dfs -ls /tab/test hadoop hdfs -ls /tab/test --手動推數據到spark表的某個分區(分區不存在的時候,先alter table xxx add partition ……) 沒有分區的spark表,直接put到表目錄下即可查到數據
hdfs dfs -put /home/tab_test.csv /tab/test/p_age=10/p_name=Tom --hdfs創建目錄
hdfs dfs -mkdir /tab/test/tab_test/p_age=11 --建立p_age分區后,show partitions看不到
hdfs dfs -mkdir /tab/test/tab_test/p_age=11/p_name=jack --繼續建立p_name分區,show partitions 依然無法看到
hdfs文件系統操作指令,類似linux上文件目錄操作 --sparkSql另一種連接方式
/home/mr/spark/bin/beeline -u "jdbc:hive2://hostName:port/" -n mr -p ""