如何解决Athena / Glue-解析简单的JSON但将其视为CSV
基于先前的question,我构建了一个简单的JSON文件,每行一个“行”。 我仍然感到震惊,因为这不是有效的JSON,因为它周围没有方括号。
一个数据文件:
{"firstName": "Neal","lastName": "Walters","city": "Irving","state","TX" }
{"firstName": "Fred","lastName": "Flintstone","city": "Bedrock","TX"}
{"firstName": "Barney","lastName": "Rubble","city": "Stillwater","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流”(因为我们在谈论文件,所以它不是一个好名字),或“以行分隔的JSON”。
我认为您最好手动创建表格。您可以从文档中找到一个示例作为起点:https://docs.aws.amazon.com/athena/latest/ug/json-serde.html
您还应该使用正确的JSON序列化库来编写JSON,以免出现语法错误(例如冒号而不是冒号)。
,也许您想更新 Glue 表属性 - 特别是
'classification'='csv',
到
'classification'='json',
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。