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
EXPERTE
gefragt vor 5 Monaten13 Aufrufe
1 Antwort
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
EXPERTE
beantwortet vor 5 Monaten

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen