Apache Drill开启extractHeader后列名修改的原因及规则咨询
Apache Drill CSV列名自动修改的原因与规则
核心原因
Apache Drill会自动对CSV提取的表头做规范化处理,目的是让列名符合SQL标识符的语法规范,避免因特殊字符、大小写冲突等问题导致查询失败。只要开启了extractHeader,这个处理逻辑就会触发。
具体规范化规则
你遇到的几种场景对应这些规则:
- 大小写统一转小写:Drill默认把所有列名转为小写,所以
PRODUCTID变成productid。 - 特殊字符替换逻辑:
- 列名开头如果是非字母字符(比如
#),会被替换成col_前缀,因此#UNITS变成col_units。 - 列名中间的特殊字符(比如
$、-、@这类),会被替换成下划线_,所以FINANCIAL$RECORD转为financial_record。
- 列名开头如果是非字母字符(比如
- 额外补充规则:
- 如果列名是SQL关键字(比如
SELECT、WHERE),会自动加下划线后缀,比如SELECT变成select_。 - 重复的列名会被加上数字后缀,比如两个
ID列会变成id和id_1。
- 如果列名是SQL关键字(比如
实用操作建议
- 查看处理后的列名:执行
DESCRIBE dfs./var/lib/PRODUCT.csv``就能看到所有规范化后的列名列表。 - 保留原大小写:修改Drill配置文件
drill-override.conf,添加drill.exec.identifier.case = PRESERVE,重启Drill后就能保留列名原大小写。 - 查询原列名:如果不想修改配置,可以用引号包裹原列名查询,比如
SELECT "#UNITS" FROM dfs./var/lib/PRODUCT.csv``(需要先配置drill.exec.identifier.quote_char = "\"")。
内容的提问来源于stack exchange,提问作者Diksha
相关产品推荐
相关产品推荐

