python连接hive读取数据并转为DataFrame时报错记录(报错:keyError:24)

目录

一、连接hive并读取数据

二、定位问题

 三、解决问题


        因工作需要,需要将sq读取到的数据转为pandas的DataFrame时引发的异常,反复检查了数据是没有问题的。最终定位到应该是数据类型导致pandas转换失败,具体原因如下文所示。

                    报错信息如下:KeyError : 24

一、连接hive并读取数据

        表中存有两列数据:时间、日期。格式为int类型。现在需要将日期和时间拼接起来,读入到python中,代码如下:

from impala.dbapi import connect
from impala.util import as_pandas
import pandas as pd



def connection(sql):
    con = connect(host = 'host',
                  port = 'port ',
                  database = 'database ',
                  auth_mechanism = '认证',
                  user = 'username',
                  password = 'password')
    try:
        cur = con.cursor()
        cur.execute(sql)
        df = as_pandas(cur)
    except Exception as e:
        print("连接出错:",e)
    finally:
        con.close()

    return df
  


sql = '''
    select date(trans_date),time(trans_time),concat(date(trans_date),' ',time(trans_time))
    from trans_data

'''
df = connection(sql)
print(df)

        点击执行会发现提示KeyError错误,第一印象是绝对数据有问题,返回数据库查看数据后发现数据并没有问题。

二、定位问题

        首先将该sql拿到hive客户端执行,发现也是没问题的。然后寻找数据的错误,就一直在找哪里有包含24的数据,最终也没有找到。但是我发现这种时间其实是timestamp类型的,然后我就试着将concat后的结果转为timestamp类型并拿到python去执行,最后奇怪的发现程序跑通了!最后我将concat之后的结果和转为timestamp类型的结果写入到一张表里(代码如下图所示)

create table desc_col as 
select date(trans_date),time(trans_time),concat(date(trans_date),' ',time(trans_time))
from trans_data

        接着查看数据类型后就发现他们两个的数据类型是不一样的,一个是timestamp,而另一个我没见过的是varchar2(28,ORACLE),这时就很奇怪怎么会是这种格式的varchar2?

python连接hive读取数据并转为DataFrame时报错记录(报错:keyError:24)_第1张图片

 三、解决问题

        最后也没搞懂为什么concat后的数据类型是这样子的,有大佬明白的可以解答一下,谢谢了。最终我将concat后的数据转为timestamp使用即可。

你可能感兴趣的:(python,报错解决,hive,hive,python)