无法导入SerDe:S3大型压缩TSV文件无法接入Glue/Athena
问题:S3上大型GZIP压缩TSV文件无法导入Athena/Glue
我在S3上存储了一个结构简单但体积庞大的GZIP压缩TSV文件(制表符分隔格式),尝试导入Glue或Athena时,无论用爬虫、Athena查询还是调整Hive配置都没法正常读取。以下是文件内容片段:
(第一行是字节形式,第二行是解码后的字符串)
[b'0\taaa.11111\t1\n', b'1\taaa.aa\t1\n', b'2\taaa.aaa\t4\n', b'3\taaa.aaaa\t1\n', b'4\taaa.aaaaaa\t1\n', b'5\taaa.aaaaaaa\t1\n', b'6\taaa.aaaaaaaa\t1\n', b'7\taaa.aaaaaaaaa\t1\n'] ['0\taaa.11111\t1\n', '1\taaa.aa\t1\n', '2\taaa.aaa\t4\n', '3\taaa.aaaa\t1\n', '4\taaa.aaaaaa\t1\n', '5\taaa.aaaaaaa\t1\n', '6\taaa.aaaaaaaa\t1\n', '7\taaa.aaaaaaaaa\t1\n']
我使用的Athena DDL语句如下:
CREATE EXTERNAL TABLE `edge4`( `id` bigint, `domain` string, 'num_hosts' bigint ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' WITH SERDEPROPERTIES ( 'escape.delim'='\\') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://commoncrawl/projects/hyperlinkgraph/cc-main-2023-may-sep-nov/domain' TBLPROPERTIES ( 'transient_lastDdlTime'='1705429326', 'write.compression'='GZIP')
解决办法
1. 修正DDL语法错误
原DDL中num_hosts字段用单引号包裹是语法错误,Athena/Hive要求字段名必须用反引号(`)包裹,否则会被识别为字符串常量,导致表结构定义失效。
2. 更换更稳定的SerDe处理TSV
默认的ROW FORMAT DELIMITED对特殊字符兼容性较差,推荐使用OpenCSVSerDe处理TSV文件,它对分隔符、转义字符的支持更可靠。
3. 调整表属性
无需指定write.compression,Athena会自动识别GZIP压缩文件;如果文件没有表头,也不需要额外设置跳过行数。
以下是修正后的DDL:
CREATE EXTERNAL TABLE `edge4`( `id` bigint, `domain` string, `num_hosts` bigint ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( 'separatorChar' = '\t', 'quoteChar' = '\"', 'escapeChar' = '\\' ) STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://commoncrawl/projects/hyperlinkgraph/cc-main-2023-may-sep-nov/domain' TBLPROPERTIES ( 'transient_lastDdlTime'='1705429326', 'has_encrypted_data'='false' );
4. Glue爬虫配置建议
如果使用Glue爬虫,配置时需注意:
- 选择“分隔符”为制表符(\t)
- 指定压缩格式为GZIP
- 爬虫会自动扫描S3路径生成表结构,若字段类型不符,可手动调整表结构。
内容的提问来源于stack exchange,提问作者leeprevost
相关产品推荐
相关产品推荐

