假设我有一个像这样的外部表:
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是关于查找有问题的文档的;这个问题是关于跳过它们。
答案 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了解更多信息。