Apache演练无法正确解析Windows EOL的CSV文件?

问题描述 投票:0回答:1

好,让我们为某人节省8个小时的无知调试。

TL; DR:Apache演练无法正确解析Windows计算机上生成的CSV文件。这是因为默认情况下,他们的EOL设置为\ r \ n,而与unix系统不同,后者的EOL设置为\ n。这就导致了可怕的不可克服的错误,因为前导\ r可能​​始终保持最后一个字段的值。有趣的是,您不会注意到它,因为它是不可见的。

我们有两个文件,一个在linux中创建,另一个在Windows中创建:hello.linux.csvhello.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钻(1.15版)处理使用Windows EOL创建的CSV文件?

csv apache-drill
1个回答
0
投票

您可以将csv格式行定界符更新为\r\n,但这将适用于文本插件范围内的所有csv文件。要更改每个表的定界符,请使用表功能。

https://drill.apache.org/docs/plugin-configuration-basics/

© www.soinside.com 2019 - 2024. All rights reserved.