HIVE_BAD_DATA:解析第3个字段值“2021-10-31 22:00:00.0”时出错:输入字符串:“2021-10-31 22:00:00.0”。

0

【以下的问题经过翻译处理】 我正在从S3读取文件,并使用Glue ETL作业来填充数据目录表。

我的S3文件长这样:

VID,ALTID,VTYPE,TIME,TIMEGMT,VALUE
ABC, ABC, DATAFEED,31-10-2021 22:00:00,01-11-2021 02:00:00,   11775.685

读入的模式如下:

root
|-- VID: string
|-- ALTID: string
|-- VTYPE: string
|-- TIME: string
|-- TIMEGMT: string
|-- VALUE: string

我正在将第3个和第4个字段从“字符串”转换为时间戳,并与我的数据目录表的模式匹配。我还做了一些其他的转换。

我这样进行转换:

df = df.withColumn("time", to_timestamp("time", 'dd-MM-yyyy HH:mm:ss'))
df = df.withColumn("timegmt", to_timestamp("timegmt", 'dd-MM-yyyy HH:mm:ss'))

当我尝试使用Athena读取数据时,我会收到一个错误:

HIVE_BAD_DATA: Error parsing field value '2021-10-31 22:00:00.0' for field 3: For input string: "2021-10-31 22:00:00.0"

数据目录表架构如下:

列名数据类型
vidstring
altidstring
vtypestring
timetimestamp
timegmttimestamp
valueint
filenamestring

而在run-1647806179090-part-r-00000文件中出现故障的行长这样:

vid,altid,vtype,time,timegmt,value,filename
ABC,ABC, DATAFEED,"2021-10-31 22:00:00.0","2021-11-01 02:00:00.0",11775,"lf_buf_20211101_005904.csv"

有人知道为什么会出现这个错误吗?我相信根据文档,这

profile picture
专家
已提问 5 个月前10 查看次数
1 回答
0

【以下的回答经过翻译处理】 结果发现,Athena的文档要么不正确,要么充其量是具有误导性的。Alexandre所提供的优秀答案在这里说得最好 https://stackoverflow.com/questions/52564194/athena-unable-to-parse-date-using-opencsvserde

基本上你需要在UNIX Epoch时间中存储日期或时间戳。你不会知道这一点,因为所有时间都被强调格式。我尝试作为时间戳,这就是我得到这个错误的原因。当我把它存储为UNIX时间时,我就有了进展。然而,unix_timestamp()函数只返回以秒为单位的长时间,并且时间戳需要以毫秒为单位的时间(双精度)。因此,我只需要乘以1000:

df = df.withColumn("time", f.unix_timestamp("time", 'dd-MM-yyyy HH:mm:ss') * 1000) 这样做之后,你会得到一个13位双精度数,如果选择了时间戳作为数据类型,Athena将正确地从中产生时间戳。

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则