我有一个
.csv
文件 data.csv 存储在以下位置:dbfs:/raw/data/externalTables/emp_data_folder/emp_data.csv
以下是文件中数据的示例:
Alice,25,50000,North
Bob,30,60000,South
Charlie,35,70000,East
David,40,80000,West
Eve,29,58000,North
Frank,50,90000,South
Grace,28,54000,East
Hannah,32,62000,West
Ian,45,72000,North
Jack,27,56000,South
使用此 .csv 文件,我使用以下 SQL 命令在 Spark 中创建了一个外部表:
%sql
CREATE TABLE IF NOT EXISTS tablesDbDef.emp_data_f (
Name STRING,
Age INTEGER,
Salary INT,
Region STRING
)
USING CSV
LOCATION '/raw/data/externalTables/emp_data_folder/'
表创建成功,可以查询,没有任何问题。
接下来,我使用以下命令将新记录插入表中:
%sql
INSERT INTO tablesDbDef.emp_data_f VALUES ('Mark', 20, 50000, 'South')
记录已成功插入,我可以在
sql
查询中看到这一点。我的理解是,如果我们插入新数据,spark
将为新插入的数据创建新文件(在本例中为.csv文件)。但是,当我检查 emp_data_folder
目录时,我没有看到为这个新插入的记录创建的任何新文件。唯一存在的文件是原始 emp_data.csv
和新生成的 _SUCCESS 文件。
我的问题是,如果新插入的数据不在文件中,那么它存储在哪里?因为我可以在
sql
查询中看到新插入的数据,但没有为此创建文件?
当您使用 USING CSV LOCATION '/path' 创建外部表时,Spark 会从文件中读取数据,但在插入新数据时不会管理文件或修改它们。
当您在外部表上使用 INSERT INTO 时,Spark 会将新数据存储在其内部元数据(例如 Hive Metastore)中,而不是原始 CSV 文件中。
Spark 将 CSV 视为只读,并且不会向其中追加记录。相反,新数据存储在 Spark 的托管存储中,允许查询但不会反映在 CSV 中。
要将新数据写回文件,您需要将表转换为托管表或将更新的数据写入新位置。