【问题标题】:ETL: how to guess data types for messy CSVs with lots of nullsETL:如何猜测带有大量空值的杂乱 CSV 的数据类型
【发布时间】:2016-01-03 11:20:12
【问题描述】:

我经常需要清理杂乱无章的 CSV 和 Excel 文件并将其导入我的 MS SQL Server 2014(但如果我使用的是 Oracle 或其他数据库,问题将是相同的)。

我找到了一种使用 Alteryx 的方法。你能帮我理解我是否可以对 Pentaho Kettle 或 SSIS 做同样的事情吗?或者,您能否推荐其他 ETL 软件来解决我的以下观点?

  1. 我经常有例如 100,000 条记录的表,其中前 90,000 条记录可能为空。大多数 ETL 工具只扫描前几百条记录来猜测数据类型,因此无法猜测这些字段的类型。我可以在猜测类型之前强制 Pentaho 或 SSIS 扫描整个文件吗?我知道这对于许多 GB 的大文件可能效率不高,但对于我处理的文件,扫描整个文件比浪费大量时间尝试手动猜测每个字段要好得多
  2. 同上,但使用字符串的长度。如果前 10,000 条记录是 3 个字符的字符串,但后面的记录更长,则 SSIS 和 Pentaho 倾向于猜测 nvarchar(3) 并且导入将失败。我可以强迫他们在猜测字符串的长度之前扫描所有行吗?或者,或者,我可以轻松地将所有字符串强制为 nvarchar(x) ,我自己设置 x 吗?
  3. Alteryx 有一个多字段工具,在清理或转换多个字段时特别方便。例如。我有 10 个日期列,其数据类型没有被自动猜到。我可以使用多字段公式让 Alteryx 将所有 10 个字段转换为日期并创建名为 $oldfield_reformatted 的新字段。 Pentajho 和 SSIS 有什么相似之处吗?

谢谢!

【问题讨论】:

  • 使用 IMEX 阅读 Excel 会有帮助。更多详情请参阅以下文章 [blog.concentra.co.uk/2013/05/15/…
  • 你确定没有限制吗? IE。如果我按照文章的建议修改注册表,Excel 真的会扫描一个,比如说,100,000 条记录文件中的所有记录吗? SSIS 中 CSV 文件的连接管理器在“建议类型”框​​中输入了“行数”,但也有上限 - 根据软件版本,记录数为 1,000 或 10,000
  • 在这种情况下,我一直非常喜欢使用 Awk 对文件进行采样,以便将更具代表性的选择传递到暂存中:awk 'BEGIN {srand()} !/^$/ { if (rand() <= .01) print $0}' 用你记录的任何百分比替换 .01 '想保留。
  • @Pythonista 匿名。当我之前采用此解决方案时,我不需要更改注册表
  • 但是我的问题恰恰出现在绝大多数记录为空且只有一小部分记录被填充的情况下。这意味着抽样很可能会导致每条记录都为空的样本......

标签: ssis etl


【解决方案1】:

一个愚蠢的建议。在 Excel 中,在列表顶部添加一行,该行具有一个公式,该公式创建一个与列中最长值长度相同的文本字符串。

这个公式作为数组公式输入就可以了..

=REPT("X",MAX(LEN(A:A)))

您还可以使用更高级的 VBA 函数来创建其他虚拟值来强制 SSIS 中的数据类型。

我没有使用过 SSIS 或类似的东西,但在过去我会将一个文件加载到一个表中,其中列 ALL 为 varchar 1000 表示所有数据都已加载,然后使用将其处理到主表中根据我的需要强制转换或删除数据值的 SQL。

这为您提供终极控制,而不是包或驱动程序。听到这是如何工作的,我感到非常惊讶!

【讨论】:

  • 我在小文件上做了一些非常相似的事情,但是我想要一个 ETL 工具来尽可能地自动化它,因为当处理 Excel 无法处理的文件时,这种方法很乏味,或者根本不可行处理,或者有太多的表(例如 10 个表,每个表有 50 个字段)
猜你喜欢
  • 2011-10-13
  • 1970-01-01
  • 2020-08-24
  • 2017-04-29
  • 1970-01-01
  • 2015-10-13
  • 2015-12-19
  • 1970-01-01
  • 2019-09-10
相关资源
最近更新 更多