【发布时间】:2019-12-03 15:10:03
【问题描述】:
好的,让我们为某人节省 8 小时的无知调试时间。
TL;DR:Apache Drill 无法正确解析 Windows 机器上生成的 CSV 文件。这是因为它们的 EOL 默认设置为 \r\n,这与 unix 系统设置为 \n 不同。这会导致可怕的无法调试的错误,因为前导 \r 可能会一直提示最后一个字段的值。有趣的是,你不会注意到这一点,因为它是不可见的。
让我们有两个文件,一个在 linux 中创建,第二个在 windows 中创建:hello.linux.csv 和 hello.win.csv。内容是一样的(至少看起来是……)
field_a,field_b
Hello,0.5
我们来问一下。
SELECT * from (...)/hello.linux.csv;
---
field_a, field_b
Hello, "0.5"
SELECT * from (...)/hello.win.csv;
---
field_a, field_b
Hello, "0.5"
很好!让我们对数据做点什么。将“0.5”转换为数字应该没问题(也是必要的)。
SELECT
field_a, CAST (field_b as DECIMAL(10, 2)) as test
from (...)/hello.linux.csv;
---
field_a, test
Hello, 0.5
-- ... aaand, here we go!
SELECT
field_a, CAST (field_b as DECIMAL(10, 2)) as test
from (...)/hello.win.csv;
[30038]Query execution error. Details:[
SYSTEM ERROR: NumberFormatException
Fragment 0:0
Please, refer to logs for more information. -- In the logs, there is only useless java stacktrace, of course.
[Error Id: 3551c939-3f5b-42c1-9b58-d600da5f12a0 on drill-develop-7bdb45c597-52rnz:31010]
]
...
(现在,想象一下在查询、数据和其他因素变得更加复杂的复杂生产设置中需要多长时间才能揭示这一点。)
问题:有没有办法强制 apache Drill (v 1.15) 处理使用 windows EOLs 创建的 CSV 文件?
【问题讨论】:
标签: csv apache-drill