在这里待了几天,非常感谢任何帮助。
背景: 我正在尝试创建 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 多个项目(不同的模式)要爬网,我想避免这种情况。
建议的解决方案:
- 理想情况下,我想强制我的爬虫将每个 CSV 的第一行解释为标题,但这似乎不可能......
- 向每个 CSV 添加一个虚拟 INT 列,以强制我的爬虫读取 CSV 标题,并删除/忽略管道中的列。(看起来很hackish)
- 找到另一种有效的文件格式(需要在我的 ETL 管道中进行更改)
- 不要使用胶水
再次感谢任何帮助!