如何仅使用Spark SQL读取DBFS/ADLS中带指定分隔符的CSV文件
在Databricks用Spark SQL直接查询带特定分隔符的CSV文件
你可以通过以下两种方式直接用Spark SQL(包括魔法命令%sql)查询ADLS或DBFS上的CSV文件,无需创建永久中间表:
方法1:直接在SELECT语句中指定CSV选项
直接使用csv.路径``的格式引用文件,并通过OPTIONS子句指定表头、分隔符等参数,示例如下:
%sql SELECT * FROM csv.`dbfs:/mnt/adls/path/to/your/data.csv` OPTIONS ( header = 'true', sep = '|', -- 替换为你的特定分隔符,比如\t、;等 inferSchema = 'true' -- 自动推断列类型,不需要的话设为'false' )
如果需要手动指定列类型(比自动推断更精准),可以用schema参数替代inferSchema:
%sql SELECT * FROM csv.`dbfs:/mnt/adls/path/to/your/data.csv` OPTIONS ( header = 'true', sep = ';', schema = 'user_id INT, user_name STRING, register_date DATE' )
方法2:创建临时视图查询
临时视图仅在当前会话有效,不会在元数据中留下永久表,适合临时查询场景:
%sql CREATE OR REPLACE TEMP VIEW temp_csv_data USING csv OPTIONS ( path = 'dbfs:/mnt/adls/path/to/your/data.csv', header = 'true', sep = '\t', -- 示例为制表符分隔 inferSchema = 'true' ); -- 之后就可以像查询普通表一样查询视图 SELECT user_name, register_date FROM temp_csv_data WHERE user_id > 100;
关键说明
- 你之前遇到的列合并、不识别表头问题,是因为Spark SQL读取CSV时默认用逗号作为分隔符,且默认不解析表头,必须显式指定
header='true'和对应sep参数才能正确解析。 - 路径支持ADLS的挂载路径(比如
dbfs:/mnt/adls/...)或原生ADLS路径(比如abfss://container@storageaccount.dfs.core.windows.net/path/...)。
内容的提问来源于stack exchange,提问作者kpython
相关产品推荐
相关产品推荐

