首页 > 解决方案 > 读取部分数据的符号文件

问题描述

我已将每月数据保存在给定的 S3 存储桶中,并且可以毫无问题地运行 athena 查询。但如果我使用符号文件,雅典娜只会读取 1 月和 7 月的数据。这很奇怪。

我的符号文件看起来像这样......

s3://some_bucket/sub_bucket/no_details_201801.csv.gz
s3://some_bucket/sub_bucket/no_details_201802.csv.gz
s3://some_bucket/sub_bucket/no_details_201803.csv.gz
s3://some_bucket/sub_bucket/no_details_201804.csv.gz
s3://some_bucket/sub_bucket/no_details_201805.csv.gz
s3://some_bucket/sub_bucket/no_details_201806.csv.gz
s3://some_bucket/sub_bucket/no_details_201807.csv.gz
s3://some_bucket/sub_bucket/no_details_201808.csv.gz
s3://some_bucket/sub_bucket/no_details_201808.csv.gz
s3://some_bucket/sub_bucket/no_details_201810.csv.gz
s3://some_bucket/sub_bucket/no_details_201811.csv.gz
s3://some_bucket/sub_bucket/no_details_201812.csv.gz

在这 12 个文件中,缺少 2 个月的数据文件,而 athena 并没有抱怨它。那很好。但它没有读取其余 10 个文件。那没问题。但它似乎只读取了 2 个不可接受的文件(随机选择)。有没有人用雅典娜符号文件经历过这个?

标签: amazon-athena

解决方案


我假设您正在使用SymlinkTextInputFormat. 如果符号链接文件中缺少任何文件,则 EMR 上的 Athena 和 Presto 都应该使查询失败。II 无法重现该问题。

CREATE EXTERNAL TABLE `symlink_test`(
  `col1` string, 
  `col2` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
WITH SERDEPROPERTIES ( 
  'escapeChar'='\\', 
  'quoteChar'='`', 
  'separatorChar'=',') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://my-bucket/datasets/symlink'

如果符号链接中的任何文件不存在,Athena 和 Presto 会给出类似于以下内容的错误消息:

HIVE_UNKNOWN_ERROR: Input path does not exist:[...]

推荐阅读