設計需要看的網(wǎng)站有哪些seo英文怎么讀
【圖書介紹】《Spark SQL大數(shù)據(jù)分析快速上手》-CSDN博客
《Spark SQL大數(shù)據(jù)分析快速上手》【摘要 書評 試讀】- 京東圖書
Spark本地模式安裝_spark3.2.2本地模式安裝-CSDN博客
DML(Data Manipulation Language,數(shù)據(jù)操作語言)操作主要用來對數(shù)據(jù)進行插入、更新和刪除操作。本節(jié)主要介紹Spark SQL中的DML操作。
Spark SQL提供了一個命令行工具,可以讓用戶直接通過命令行運行SQL查詢。Spark SQL可以兼容Hive,以便Spark SQL支持Hive表訪問、UDF(用戶自定義函數(shù))以及Hive查詢語言(HiveQL/HQL)。
若要使用Spark SQL CLI的方式訪問和操作Hive表數(shù)據(jù),需要對Spark SQL進行如下所示的環(huán)境配置,將Spark SQL連接到一個部署好的Hive上。
(1)將hive-site.xml復制到/home/hadoop/app/spark/conf/目錄下。
(2)在/home/hadoop/app/spark/conf/spark-env.sh文件中配置MySQL驅(qū)動。
將MySQL驅(qū)動復制到所有節(jié)點的Spark安裝包的jars目錄下,并在/home/hadoop/app/spark/ conf/spark-env.sh末尾添加以下內(nèi)容:
export SPARK_CLASSPATH=/home/hadoop/app/spark/jars/mysl-connector-java-5.1.32.jar
然后,啟動MySQL服務。
(3)啟動 Hive的metastore服務:hive–service metastore &。
(4)進入/home/hadoop/app/spark/sbin/目錄,執(zhí)行./start-all.sh,啟動Spark。
(5)進入/home/hadoop/app/spark/bin目錄,執(zhí)行./spark-sql,開啟Spark SQL CLI。
spark-sql本質(zhì)上是通過spark-submit調(diào)用Spark SQL的API,每個spark-sql單獨啟動一個應用。
一旦進入Spark SQL CLI,就可以執(zhí)行SQL語句。在DML語句中,通過建表語句中的Using子句來指定具體的數(shù)據(jù)源類型。如果沒有通過Using指定,則默認是通過Hive建表,相當于直接通過Spark SQL來操作Hive表的數(shù)據(jù)。
5.2.1 ?插入數(shù)據(jù)
INSERT語句將新行插入表中或覆蓋表中的現(xiàn)有數(shù)據(jù)。插入的行可以由值表達式或查詢結(jié)果指定。
1. 使用VALUES子句進行單行插入
CREATE TABLE students (name VARCHAR(64), address VARCHAR(64))USING PARQUET PARTITIONED BY (student_id INT);
INSERT INTO students VALUES('Amy Smith', '123 Park Ave, San Jose', 111111);SELECT * FROM students;
+---------+----------------------+----------+
| name| address |student_id|
+---------+----------------------+----------+
|Amy Smith|123 Park Ave, San Jose| 111111|
+---------+----------------------+----------+
2. 使用VALUES子句進行多行插入
INSERT INTO students VALUES('Bob Brown', '456 Taylor St, Cupertino', 222222),('Cathy Johnson', '789 Race Ave, Palo Alto', 333333);SELECT * FROM students;
+-------------+------------------------+----------+
| name| address|student_id|
+-------------+------------------------+----------+
| Amy Smith| 123 Park Ave, San Jose| 111111|
+-------------+------------------------+----------+
| Bob Brown|456 Taylor St, Cupertino| 222222|
+-------------+------------------------+----------+
|Cathy Johnson| 789 Race Ave, Palo Alto| 333333|
+--------------+-----------------------+----------+
3. 使用SELECT語句插入數(shù)據(jù)
假設已經(jīng)創(chuàng)建了一張persons表,里面包含兩條數(shù)據(jù):
SELECT * FROM persons;
+-------------+--------------------------+---------+
| name| address| ssn|
+-------------+--------------------------+---------+
|Dora Williams|134 Forest Ave, Menlo Park|123456789|
+-------------+--------------------------+---------+
| Eddie Davis| 245 Market St, Milpitas|345678901|
+-------------+--------------------------+---------+INSERT INTO students PARTITION (student_id = 444444)SELECT name, address FROM persons WHERE name = "Dora Williams";
使用SELECT語句插入一條數(shù)據(jù),查詢結(jié)果如下:
SELECT * FROM students;
+-------------+--------------------------+----------+
| name| address|student_id|
+-------------+--------------------------+----------+
| Amy Smith| 123 Park Ave, San Jose| 111111|
+-------------+--------------------------+----------+
| Bob Brown| 456 Taylor St, Cupertino| 222222|
+-------------+--------------------------+----------+
|Cathy Johnson| 789 Race Ave, Palo Alto| 333333|
+-------------+--------------------------+----------+
|Dora Williams|134 Forest Ave, Menlo Park| 444444|
+-------------+--------------------------+----------+
4. 使用TABLE語句插入數(shù)據(jù)
提前創(chuàng)建一張表visiting_students,插入兩條數(shù)據(jù),查詢結(jié)果顯示如下:
SELECT * FROM visiting_students;
+-------------+---------------------+----------+
| name| address|student_id|
+-------------+---------------------+----------+
|Fleur Laurent|345 Copper St, London| 777777|
+-------------+---------------------+----------+
|Gordon Martin| 779 Lake Ave, Oxford| 888888|
+-------------+---------------------+----------+
然后利用Table語句將visiting_students表的數(shù)據(jù)插入students表中。注意,這里不是覆蓋,而是追加數(shù)據(jù)。
INSERT INTO students TABLE visiting_students;SELECT * FROM students;
+-------------+--------------------------+----------+
| name| address|student_id|
+-------------+--------------------------+----------+
| Amy Smith| 123 Park Ave, San Jose| 111111|
+-------------+--------------------------+----------+
| Bob Brown| 456 Taylor St, Cupertino| 222222|
+-------------+--------------------------+----------+
|Cathy Johnson| 789 Race Ave, Palo Alto| 333333|
+-------------+--------------------------+----------+
|Dora Williams|134 Forest Ave, Menlo Park| 444444|
+-------------+--------------------------+----------+
|Fleur Laurent| 345 Copper St, London| 777777|
+-------------+--------------------------+----------+
|Gordon Martin| 779 Lake Ave, Oxford| 888888|
+-------------+--------------------------+----------+
5. 使用列列表插入數(shù)據(jù)
INSERT INTO students (address, name, student_id) VALUES('Hangzhou, China', 'Kent Yao', 11215016);SELECT * FROM students WHERE name = 'Kent Yao';
+---------+----------------------+----------+
| name| address|student_id|
+---------+----------------------+----------+
|Kent Yao | Hangzhou, China| 11215016|
+---------+----------------------+----------+
5.2.2 ?加載數(shù)據(jù)
LOAD DATA語句將數(shù)據(jù)從用戶指定的目錄或文件加載到Hive表中。如果指定了目錄,則加載該目錄中的所有文件;如果指定了文件,則僅加載單個文件。此外,該LOAD DATA語句還采用可選的分區(qū)規(guī)范。當指定分區(qū)時,數(shù)據(jù)文件(當輸入源是目錄時)或單個文件(當輸入源是文件時)被加載到目標表的分區(qū)中。
如果該表已緩存,則該命令會清除該表的緩存數(shù)據(jù)以及引用該表的所有依賴項。下次訪問表或依賴項時,緩存將被延遲填充。
LOAD DATA語句的格式如下:
LOAD DATA [ LOCAL ] INPATH path [ OVERWRITE ] INTO TABLE table_identifier [ partition_spec ]
下面舉例說明加載數(shù)據(jù)的用法。
首先,創(chuàng)建表students,并添加一條數(shù)據(jù):
CREATE TABLE students (name VARCHAR(64), address VARCHAR(64))USING HIVE PARTITIONED BY (student_id INT);
INSERT INTO students VALUES('Amy Smith', '123 Park Ave, San Jose', 111111);SELECT * FROM students;
+---------+----------------------+----------+
| name| address |student_id|
+---------+----------------------+----------+
|Amy Smith|123 Park Ave, San Jose| 111111|
+---------+----------------------+----------+
在Spark SQL中,可以使用CREATE TABLE語句結(jié)合USING HIVE選項,來創(chuàng)建一個指向Hive表的Spark SQL表。這允許我們利用Spark SQL進行查詢,但數(shù)據(jù)和元數(shù)據(jù)仍然存儲在Hive中。示例代碼如下:
CREATE TABLE my_spark_table
USING HIVE
OPTIONS (tableName "my_hive_table"
)
在這個例子中,my_spark_table是在Spark SQL中創(chuàng)建的表的名稱,而my_hive_table是Hive中已存在的表的名稱。當查詢my_spark_table時,Spark SQL會查詢Hive中的my_hive_table表。
接下來用Spark SQL創(chuàng)建一張表test_load,該表的數(shù)據(jù)和元數(shù)據(jù)會指向Hive中。最后將students表中的數(shù)據(jù)加載到test_load表中。
CREATE TABLE test_load (name VARCHAR(64), address VARCHAR(64), student_id INT) USING HIVE;
LOAD DATA LOCAL INPATH '/user/hive/warehouse/students' OVERWRITE INTO TABLE test_load;SELECT * FROM test_load;
+---------+----------------------+----------+
| name| address |student_id|
+---------+----------------------+----------+
|Amy Smith|123 Park Ave, San Jose| 111111|
+---------+----------------------+----------+
如何優(yōu)化Spark SQL中的DML操作,以提升大數(shù)據(jù)分析性能,尤其是在高并發(fā)插入和更新操作場景下?
在Spark SQL中優(yōu)化DML操作,尤其是高并發(fā)的插入和更新操作,可以通過以下方法來提升性能:
-
數(shù)據(jù)本地性優(yōu)化:確保Spark任務能夠訪問到數(shù)據(jù)的本地副本,以減少網(wǎng)絡延遲。
-
分區(qū)表:使用分區(qū)表可以顯著減少需要掃描的數(shù)據(jù)量,提升查詢性能。
-
索引:適當?shù)乃饕梢约涌觳樵兯俣?#xff0c;但是應當注意,過多的索引會影響寫操作性能。
-
批量操作:使用批量插入和更新,而不是單條操作,可以減少網(wǎng)絡開銷和Spark任務的啟動時間。
-
動態(tài)分區(qū)插入:對于分區(qū)表,使用
INSERT OVERWRITE
代替INSERT
,可以避免在每次插入時重新計算分區(qū)。 -
內(nèi)存優(yōu)化:調(diào)整Spark執(zhí)行內(nèi)存參數(shù),確保內(nèi)存使用最優(yōu)化。
-
并行度控制:適當控制Spark任務的并行度,避免資源過度競爭。
-
數(shù)據(jù)壓縮:在存儲層面優(yōu)化數(shù)據(jù)壓縮方式,減少存儲空間同時提升讀寫性能。
在實際應用中,根據(jù)具體的數(shù)據(jù)特征、資源限制和業(yè)務需求,可能需要進一步的調(diào)優(yōu)以達到最優(yōu)性能。
?