首页 > 解决方案 > 如何跳过与 Athena 中的架构不匹配的文档?

问题描述

假设我有一个像这样的外部表:

CREATE EXTERNAL TABLE my.data (
  `id` string,
  `timestamp` string,
  `profile` struct<
    `name`: string,
    `score`: int>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = '1',
  'ignore.malformed.json' = 'true'
)
LOCATION 's3://my-bucket-of-data'
TBLPROPERTIES ('has_encrypted_data'='false');

我的一些文档无效profile.score(字符串而不是整数)。

这会导致 Athena 中的查询失败:

"Status": { "State": "FAILED", "StateChangeReason": "HIVE_BAD_DATA: 解析字段 0 的字段值时出错:对于输入字符串:\"4099999.9999999995\"",

如何配置 Athena 以跳过不适合外部表架构的文档?


这里的问题是关于查找有问题的文件;这个问题是关于跳过它们。

标签: amazon-athena

解决方案


这是有关如何排除特定文件的示例

SELECT
   * 
FROM 
    "some_database"."some_table"
WHERE(
  "$PATH" != 's3://path/to/a/file'
)

刚刚测试了这种方法

SELECT 
   COUNT(*)
FROM 
    "some_database"."some_table"
-- Result: 68491573

SELECT 
   COUNT(*)
FROM 
    "some_database"."some_table"
WHERE(
  "$PATH" != 's3://path/to/a/file'
)
-- Result: 68041452

SELECT 
   COUNT(*)
FROM 
    "some_database"."some_table"
WHERE(
  "$PATH" = 's3://path/to/a/file'
)
-- Result: 450121

总计:450121 + 68041452 = 68491573


推荐阅读