Databricks SQL中CONCAT函数莫名添加.0字符的问题
问题:Databricks SQL中CONCAT拼接数值列出现
.0后缀 问题场景
原始Parquet表数据:
| ColA | ColB |
|---|---|
| 10001 | 25678 |
| 18921 | 25678 |
| 27331 | 89011 |
执行查询:
SELECT cola, colb, CONCAT(cola, colb) AS colc FROM <目标Parquet表>
预期输出:
| ColA | ColB | ColC |
|---|---|---|
| 10001 | 25678 | 1000125678 |
| 18921 | 25678 | 1892125678 |
| 27331 | 89011 | 2733189011 |
实际输出:
| ColA | ColB | ColC |
|---|---|---|
| 10001 | 25678 | 10001.025678.0 |
| 18921 | 25678 | 18921.025678.0 |
| 27331 | 89011 | 27331.089011.0 |
原因分析
问题核心是列的数据类型:你看到的ColA、ColB表面是整数,但实际Parquet表中这两列的类型是浮点型(比如Double/Float),而非整数型(INT/BIGINT)。
Databricks SQL的CONCAT函数处理非字符串类型时,会自动将其转换为字符串格式。对于浮点型数值,哪怕存储的是整数,转字符串时也会保留.0的小数后缀,最终拼接后就出现了10001.025678.0这类结果。
而w3schools的测试环境中使用的是真正的整数类型,所以CONCAT直接按整数的字符串形式拼接,不会带.0。
解决方案
在拼接前,先将浮点型列转换为整数类型,或者直接转换为字符串类型,再执行CONCAT:
方案1:先转整数再拼接
SELECT cola, colb, CONCAT(CAST(cola AS INT), CAST(colb AS INT)) AS colc FROM <目标Parquet表>
方案2:直接转字符串拼接
SELECT cola, colb, CONCAT(CAST(cola AS STRING), CAST(colb AS STRING)) AS colc FROM <目标Parquet表>
两种方案都能得到预期的拼接结果。如果数据中存在非整数的浮点值,方案2会保留原始小数部分,方案1则会截断小数(需根据业务场景选择)。
内容的提问来源于stack exchange,提问作者Yoddlenod
相关产品推荐
相关产品推荐

