csv AWS Glue Crawler使用tsv文件创建空表,但不使用分号分隔的文件

jvidinwx  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(99)

我有一个AWS Glue Crawler,在S3上有3个数据存储,每个数据存储都是表的S3路径。当文件以分号分隔时,爬虫工作得很好,而当文件以制表符分隔时,爬虫就崩溃了。但是,根据AWS官方文档,CSV内置分类器
检查以下分隔符:逗号(,),管道(|),tab(\t),分号(;)和Ctrl-A(\u0001)。Ctrl-A是标题开始的Unicode控制字符。
让我提供更多细节。
S3的结构如下(都在同一个bucket中):

|--table_1
|---------|partion_a=1
|------------------|partion_b=2
|---------------------------|partion_c=3
|------------------------------------|partion_d=4
|-----------------------------------------------|file_1.csv
|--table_2
|---------|partion_a=1
|------------------|partion_b=2
|---------------------------|partion_c=3
|------------------------------------|partion_d=4
|-----------------------------------------------|file_2.csv
|--table_3
|---------|partion_a=1
|------------------|partion_b=2
|---------------------------|partion_c=3
|--------------------------------------|file_3a.csv
|---------------------------|partion_c=4
|--------------------------------------|file_3b.csv
|---------------------------|partion_c=5
|--------------------------------------|file_3c.csv

字符串
Crawler按预期使用table_1和table_2,即它创建2个表,它将分类标识为CSV,它创建3个分区,它检测报头。
虽然它对table_3不能正常工作:

  • 它确实在数据目录中创建了一个表;
  • 它确实添加了分区(它们全部,即,partition_c = 3、4和5);
  • 但是它不检测模式,即完全没有列

CloudWathc日志中没有报告错误,而如果我在Athena上查询table_3(SELECT * FROM Table_3 LIMIT 10),我会得到以下错误:

"HIVE_UNKNOWN_ERROR: serDe should not be accessed from a null StorageFormat"


这些是表文件之间的主要区别:
1.表_1文件很小,即约20 KB,以分号分隔;

  1. Table_2文件大于Table_1但仍然很小,即约20 MB,以分号分隔;
    1.表_3文件要大得多,即大约200 MB,并且是制表符分隔的。
    我尝试将table_3文件重命名为.tsv并重新运行爬虫,但没有任何变化。我也尝试过为table_3使用一个较小的文件,即只有partition_c=3,大小约为2 MB,但没有任何变化。
    你知道为什么会发生这种情况以及如何解决它吗?我应该只为.tsv文件创建一个自定义分类器吗?
ndh0cuux

ndh0cuux1#

为了创建TSV表而不是(逗号(,),管道(|),tab(\t),分号(;)和Ctrl-A(\u0001)),您需要通过AWS Athena编辑器查询创建表和模式定义。
Athena中负责阅读和解析数据的组件称为serde,是serializer/deserializer的缩写。如果在创建Athena表时没有指定任何其他内容,则会得到一个名为LazySimpleSerDe的serde,它是为CSV等分隔文本而设计的。它可以配置不同的分隔符、转义符和行结束符等。
定义创建表命令并提供表模式后,需要添加以下内容:

...
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
...

字符串
在后台,当您看到实际的表DML时,您将看到它如何使用以下正则表达式解析数据:

ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.RegexSerDe' 
WITH SERDEPROPERTIES ( 
  'input.regex'='^(?!#)([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+[^(]+[(]([^\;]+).*\\%20([^/]+)[/](.*)$')


阅读更多:
LazySimpleSerDe for CSV, TSV, and custom-delimited files
Working with CSV

相关问题