1

在这里待了几天,非常感谢任何帮助。

背景: 我正在尝试创建 1+ 胶水爬虫来爬取以下 S3“目录”结构:

.
+-- _source1
|   +-- _item1
|   |   +-- _2019  #year
|   |   |   +-- _08  #month
|   |   |   |   +-- _30  #day
|   |   |   |   |   +-- FILE1.csv  #files
|   |   |   |   |   +-- FILE2.csv
|   |   |   |   +-- _31
|   |   |   |   |   +-- FILE1.csv
|   |   |   |   |   +-- FILE2.csv
|   |   |   +-- _09
|   |   |   |   +-- _01
|   |   |   |   +-- _02
|   +-- _item2
|   |   +-- _2019
|   |   |   +-- _08
|   |   |   |   +-- _30
|   |   |   |   +-- _31
|   |   |   +-- _09
|   |   |   |   +-- _01
|   |   |   |   +-- _02
+-- _source2
|   +-- ....
........  # and so on...

这适用于多个来源,每个来源可能有 30 多个项目,每个项目都包含年/月/日目录结构。

所有文件都是 CSV,文件一旦在 S3 中就不应更改。但是,每个项目文件夹中的文件架构将来可能会添加列。

  • 2019/12/01/FILE.csv与 相比可能有额外的列2019/09/01/FILE.csv

我做了什么:

到目前为止,在我的测试中,只要没有 CSV 仅包含字符串类型的列source,在级别目录(见上文)创建的爬虫就可以完美运行。 这是由于以下限制,如 AWS 文档中所述

标题行必须与数据行充分不同。要确定这一点,必须将一个或多个行解析为非 STRING 类型。如果所有列都是 STRING 类型,则第一行数据与后续行的差异不足以用作标题。

通常,我想您可以通过创建一个需要某个 CSV 模式的自定义分类器来解决这个问题,但是看到我可能有 200 多个项目(不同的模式)要爬网,我想避免这种情况。


建议的解决方案:

  1. 理想情况下,我想强制我的爬虫将每个 CSV 的第一行解释为标题,但这似乎不可能......
  2. 向每个 CSV 添加一个虚拟 INT 列,以强制我的爬虫读取 CSV 标题,并删除/忽略管道中的列。(看起来很hackish)
  3. 找到另一种有效的文件格式(需要在我的 ETL 管道中进行更改)
  4. 不要使用胶水

再次感谢任何帮助!

4

1 回答 1

1

发现问题: 为了使更新的胶水爬虫分类器生效,必须创建一个新的爬虫并应用更新的分类器。据我所知,AWS 文档中没有明确提到这一点,而且我只在 github 上看到过提及它

在我的测试早期,我修改了一个现有的 csv 分类器,它指定了"Has Columns",但从未创建一个新的爬虫来应用我修改后的分类器。一旦我创建了一个新的爬虫并应用了分类器,所有数据目录表都按预期创建,而不管列类型如何。

TL;DR: 修改后的分类器将不会生效,除非它们应用于新的爬虫。 资源

于 2019-09-06T14:33:06.887 回答