如何在Databricks外部表的SQL查询中获取文件内的行号?
在Databricks中获取CSV外部表记录的文件内行号
针对指向单个CSV文件或CSV目录的外部表,你可以结合Databricks内置函数与窗口函数实现需求,具体方案如下:
实现思路
用input_file_name()函数定位每条记录所属的源文件,借助Databricks自动生成的隐藏列__FILE_POSITION__(记录在文件内的字节偏移位置)保证排序与文件行顺序一致,最后通过ROW_NUMBER()窗口函数按文件分区计算行号。
具体SQL语句
SELECT name, type, ROW_NUMBER() OVER (PARTITION BY input_file_name() ORDER BY __FILE_POSITION__) AS row_number FROM animals_csv
关键说明
input_file_name():返回当前记录对应的源文件完整路径,用于按文件分区,确保每个文件内的行号独立计算。__FILE_POSITION__:代表记录在源文件中的字节偏移量,以此排序能严格匹配文件内的原生行顺序。- 单个CSV文件场景下,
PARTITION BY input_file_name()仅生成一个分区,行号从1开始连续递增;多文件目录场景下,每个文件内的行号都会从1重新计数。
示例验证
针对你提供的CSV内容:
lion,mammal shark,fish lizard,reptile
执行上述SQL后,将得到预期结果:
lion mammal 1 shark fish 2 lizard reptile 3
内容的提问来源于stack exchange,提问作者Chris Hunt
相关产品推荐
相关产品推荐

