我需要从表“data\u test”中访问json结构:
id (string)
att (struct<field1:string;field2:string;field3:int>)
SELECT
id,
att.field1,
att.field2,
att.field3
FROM database.data_test as rawdata
我收到以下错误:
配置单元\错误\数据:分析字段1的字段值时出错:对于输入字符串:“2147483648”
所以,据我所知,字符串字段中有一个数值2147483648,这会导致数据损坏。
然后我尝试将字符串字段转换为varchar,但结果是相同的。
SELECT
id,
CAST(att.field1 as VARCHAR) as field1,
CAST(att.field2 as VARCHAR) as field2,
att.field3
FROM database.data_test as rawdata
配置单元\错误\数据:分析字段1的字段值时出错:对于输入字符串:“2147483648”
当我选择id时,一切正常。
SELECT
id
FROM database.data_test as rawdata
不幸的是,我甚至不知道损坏数据的id,否则我就用where子句跳过它们。我只能通过雅典娜访问数据,所以我很难获得更多的信息。我要求aws管理员添加ignore.malformed-选项,以便json文件不允许损坏的数据。他告诉我,他做不到,因为比要多的数据会被跳过。
WITH SERDEPROPERTIES ('ignore.malformed.json' = 'true')
管理员给了我ddl:
CREATE EXTERNAL TABLE ${dbName}.${tableName}(
`id` string,
`att` struct<field1:string,field2:string,field3:int>
ROW FORMAT SERDE
'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ('paths'='att')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://${outPutS3BucketLocation}'
TBLPROPERTIES (
'CrawlerSchemaDeserializerVersion'='1.0',
'CrawlerSchemaSerializerVersion'='1.0',
'UPDATED_BY_CRAWLER'='create_benchmark_athena_table',
'averageRecordSize'='87361',
'classification'='json',
'compressionType'='gzip',
'objectCount'='1',
'recordCount'='100',
'sizeKey'='315084',
'typeOfData'='file')
我有三个问题:
是否有办法选择甚至损坏的数据,例如所有字段作为字符串?
我可以跳过select语句中损坏的数据吗?
如何获取更多信息(如损坏数据的id字段)以在where子句中跳过它?
谢谢!
暂无答案!
目前还没有任何答案,快来回答吧!