如何在Athena中跳过与架构不匹配的文档?

时间:2019-11-19 14:15:48

标签: amazon-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中的查询失败:

  

“状态”:{         “状态”:“失败”,         “ StateChangeReason”:“ HIVE_BAD_DATA:解析字段0的字段值时出错:对于输入字符串:\” 4099999.9999999995 \“”,

如何配置Athena跳过不适合外部表模式的文档?


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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我遇到了同样的问题。由于找不到特定的解决方案,因此我使用了另一种方法。它可能会帮助您。 该错误与配置文件字段中的错误数据有关。由于您在个人资料字段中使用“结构”,因此Athena希望源文件中以结构化方式提供个人资料字段的数据。如果此字段中有任何不良数据,您将遇到此错误。

您可以尝试以下查询吗?

CREATE EXTERNAL TABLE my.data (
id string,
timestamp string,
profile string
)
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');

并使用以下查询获得预期结果

select 
 id
 ,timestamp
 ,socialdata
 ,json_extract_scalar(profile, '$.name')profile_name
 ,json_extract_scalar(profile, '$.score')profile_score
 from my.data;

您可以访问此link了解更多信息。