AWS Glue 爬虫 - 如何处理可能仅包含字符串的 CSV 的大型目录结构
AWS Glue Crawlers - How to handle large directory structure of CSVs that may only contain strings
已经在这里工作了几天,非常感谢任何帮助。
背景:
我正在尝试创建 1+ 胶水爬虫来爬取以下 S3 "directory" 结构:
.
+-- _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 多个项目,每个项目都包含 year/month/day 目录结构。
所有文件都是 CSV 文件,文件在 S3 中后不应更改。但是,每个 item 文件夹中文件的架构将来可能会添加列。
与 2019/09/01/FILE.csv
. 相比,2019/12/01/FILE.csv
可能有更多列
我做了什么:
到目前为止,在我的测试中,在 source
级目录(见上文)中创建的抓取工具运行良好 只要没有 CSV 仅包含 string-type 列.
这是由于以下限制,as stated in the AWS docs:
The header row must be sufficiently different from the data rows. To determine this, one or more of the rows must parse as other than STRING type. If all columns are of type STRING, then the first row of data is not sufficiently different from subsequent rows to be used as the header.
通常情况下,我认为您可以通过创建一个需要特定 CSV 模式的自定义分类器来解决这个问题,但鉴于我可能有 200 多个项目(不同模式)要抓取,我想避免这个。
建议的解决方案:
- 理想情况下,我想强制我的爬虫解释第一行
每个 CSV 作为 header,但这似乎不可能...
- 向每个 CSV 添加一个虚拟 INT 列,以强制我的抓取工具读取 CSV headers,并且 delete/ignore 管道中的列。 (看起来很黑)
- 找到另一种有效的文件格式(需要在整个 ETL 管道中进行更改)
- 不要使用胶水
再次感谢您的帮助!
发现问题: 事实证明,为了使更新的粘合爬虫分类器生效,必须创建一个新的爬虫并应用更新的分类器。据我所知,这在 AWS 文档中没有明确提及,我只看到提到它 over on github
在测试的早期,我修改了一个现有的 csv 分类器,该分类器指定 "Has Columns",但从未创建新的爬虫来应用我修改后的分类器。一旦我创建了一个新的爬虫并应用了分类器,所有数据目录表都按预期创建,无论列类型如何。
TL;DR: 修改后的分类器只有应用到新的爬虫上才会生效。 Source
已经在这里工作了几天,非常感谢任何帮助。
背景: 我正在尝试创建 1+ 胶水爬虫来爬取以下 S3 "directory" 结构:
.
+-- _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 多个项目,每个项目都包含 year/month/day 目录结构。
所有文件都是 CSV 文件,文件在 S3 中后不应更改。但是,每个 item 文件夹中文件的架构将来可能会添加列。
-
与
2019/12/01/FILE.csv
可能有更多列
2019/09/01/FILE.csv
. 相比,我做了什么:
到目前为止,在我的测试中,在 source
级目录(见上文)中创建的抓取工具运行良好 只要没有 CSV 仅包含 string-type 列.
这是由于以下限制,as stated in the AWS docs:
The header row must be sufficiently different from the data rows. To determine this, one or more of the rows must parse as other than STRING type. If all columns are of type STRING, then the first row of data is not sufficiently different from subsequent rows to be used as the header.
通常情况下,我认为您可以通过创建一个需要特定 CSV 模式的自定义分类器来解决这个问题,但鉴于我可能有 200 多个项目(不同模式)要抓取,我想避免这个。
建议的解决方案:
- 理想情况下,我想强制我的爬虫解释第一行 每个 CSV 作为 header,但这似乎不可能...
- 向每个 CSV 添加一个虚拟 INT 列,以强制我的抓取工具读取 CSV headers,并且 delete/ignore 管道中的列。 (看起来很黑)
- 找到另一种有效的文件格式(需要在整个 ETL 管道中进行更改)
- 不要使用胶水
再次感谢您的帮助!
发现问题: 事实证明,为了使更新的粘合爬虫分类器生效,必须创建一个新的爬虫并应用更新的分类器。据我所知,这在 AWS 文档中没有明确提及,我只看到提到它 over on github
在测试的早期,我修改了一个现有的 csv 分类器,该分类器指定 "Has Columns",但从未创建新的爬虫来应用我修改后的分类器。一旦我创建了一个新的爬虫并应用了分类器,所有数据目录表都按预期创建,无论列类型如何。
TL;DR: 修改后的分类器只有应用到新的爬虫上才会生效。 Source