Athena/Glue - 解析简单 JSON(但将其视为 CSV)
Athena/Glue - Parsing simple JSON (but treats it like a CSV)
基于我之前的 ,我构建了一个简单的 JSON 文件,每行一个“行”。
我仍然感到震惊,因为这无效 JSON,因为它周围没有方括号。
一个数据文件:
{"firstName": "Neal", "lastName": "Walters", "city": "Irving", "state", "TX" }
{"firstName": "Fred", "lastName": "Flintstone", "city": "Bedrock", "state", "TX"}
{"firstName": "Barney", "lastName": "Rubble", "city": "Stillwater", "state", "OK"}
在运行通过GLUE之后,这是我的第一个查询,非常令人失望。
下面是它生成的架构。从中我们可以看出,GLUE 显然认为这是一个 CSV 而不是 JSON。在设置询问文件类型的 Glue 爬虫时,我没有看到任何选项,我是不是在某个隐藏选项的某处遗漏了这个?
对于像这样的简单示例,我可能可以手动修复架构。但是 GLUE 真的是一个如此糟糕的解析器吗?在我的实际应用程序中,我有大约 150 个字段,因此理想情况下它会为我生成所有列。
CREATE EXTERNAL TABLE `flattb_testflatjson`(
`col0` string,
`col1` string,
`col2` string,
`col3` string,
`col4` string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://relatix/polygonData/history/testflatjson/'
TBLPROPERTIES (
'CrawlerSchemaDeserializerVersion'='1.0',
'CrawlerSchemaSerializerVersion'='1.0',
'UPDATED_BY_CRAWLER'='FlatJsonTestForAthena',
'areColumnsQuoted'='false',
'averageRecordSize'='83',
'classification'='csv',
'columnsOrdered'='true',
'compressionType'='none',
'delimiter'=',',
'objectCount'='1',
'recordCount'='3',
'sizeKey'='255',
'typeOfData'='file')
胶水一般来说很糟糕,但这实际上让我感到惊讶,直到我看到 Achyut 的评论:你的 JSON 格式错误。
JSON是一种数据格式,不是文件格式。没有格式正确的 JSON 文件这样的东西,因为规范没有涵盖这一点。 Spark、Hadoop 和 Athena 等工具要求 JSON 数据在文件中,每行一个文档,因为这样可以轻松高效地处理数据。有时这被称为“JSON 流”(这不是一个好名字,因为我们谈论的是文件),或“line-delimited JSON”。
我认为您最好手动创建 table。您可以在文档中找到一个示例作为起点:https://docs.aws.amazon.com/athena/latest/ug/json-serde.html
您还应该使用适当的 JSON 序列化库来编写 JSON,这样您就不会出现语法错误,例如意外的逗号而不是冒号。
您可能想要更新 Glue table 属性 -
特别是
'classification'='csv',
至
'classification'='json',
基于我之前的
一个数据文件:
{"firstName": "Neal", "lastName": "Walters", "city": "Irving", "state", "TX" }
{"firstName": "Fred", "lastName": "Flintstone", "city": "Bedrock", "state", "TX"}
{"firstName": "Barney", "lastName": "Rubble", "city": "Stillwater", "state", "OK"}
在运行通过GLUE之后,这是我的第一个查询,非常令人失望。
下面是它生成的架构。从中我们可以看出,GLUE 显然认为这是一个 CSV 而不是 JSON。在设置询问文件类型的 Glue 爬虫时,我没有看到任何选项,我是不是在某个隐藏选项的某处遗漏了这个?
对于像这样的简单示例,我可能可以手动修复架构。但是 GLUE 真的是一个如此糟糕的解析器吗?在我的实际应用程序中,我有大约 150 个字段,因此理想情况下它会为我生成所有列。
CREATE EXTERNAL TABLE `flattb_testflatjson`(
`col0` string,
`col1` string,
`col2` string,
`col3` string,
`col4` string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://relatix/polygonData/history/testflatjson/'
TBLPROPERTIES (
'CrawlerSchemaDeserializerVersion'='1.0',
'CrawlerSchemaSerializerVersion'='1.0',
'UPDATED_BY_CRAWLER'='FlatJsonTestForAthena',
'areColumnsQuoted'='false',
'averageRecordSize'='83',
'classification'='csv',
'columnsOrdered'='true',
'compressionType'='none',
'delimiter'=',',
'objectCount'='1',
'recordCount'='3',
'sizeKey'='255',
'typeOfData'='file')
胶水一般来说很糟糕,但这实际上让我感到惊讶,直到我看到 Achyut 的评论:你的 JSON 格式错误。
JSON是一种数据格式,不是文件格式。没有格式正确的 JSON 文件这样的东西,因为规范没有涵盖这一点。 Spark、Hadoop 和 Athena 等工具要求 JSON 数据在文件中,每行一个文档,因为这样可以轻松高效地处理数据。有时这被称为“JSON 流”(这不是一个好名字,因为我们谈论的是文件),或“line-delimited JSON”。
我认为您最好手动创建 table。您可以在文档中找到一个示例作为起点:https://docs.aws.amazon.com/athena/latest/ug/json-serde.html
您还应该使用适当的 JSON 序列化库来编写 JSON,这样您就不会出现语法错误,例如意外的逗号而不是冒号。
您可能想要更新 Glue table 属性 - 特别是
'classification'='csv',
至
'classification'='json',