为什么Spark向外部表插入数据后不创建新文件?

问题描述 投票:0回答:1

我有一个

.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
查询中看到新插入的数据,但没有为此创建文件?

apache-spark hive databricks external-tables
1个回答
0
投票

当您使用 USING CSV LOCATION '/path' 创建外部表时,Spark 会从文件中读取数据,但在插入新数据时不会管理文件或修改它们。

当您在外部表上使用 INSERT INTO 时,Spark 会将新数据存储在其内部元数据(例如 Hive Metastore)中,而不是原始 CSV 文件中。

Spark 将 CSV 视为只读,并且不会向其中追加记录。相反,新数据存储在 Spark 的托管存储中,允许查询但不会反映在 CSV 中。

要将新数据写回文件,您需要将表转换为托管表或将更新的数据写入新位置。

© www.soinside.com 2019 - 2024. All rights reserved.