Redshift python连接器列名称是字节字符串

Posted

技术标签:

【中文标题】Redshift python连接器列名称是字节字符串【英文标题】:Redshift python connector columns names are byte string 【发布时间】:2021-10-28 18:38:44 【问题描述】:

假设我在 redshift 中有下表:

a | b
-----
1 | 2
3 | 4

如果我想将它从 Redshift 中提取到 pd.DataFrame,我可以执行以下操作:

import redshift_connector
import pandas as pd

query = 'SELECT * FROM table'
conn = redshift_connector(user=user, host=host, password=password, port=port, database=database)

df = pd.read_sql_query(query, conn)

我正在使用以下包redshift_connector。但问题是df 中的列名是字节串:

df['a']

这将返回错误,因为列的名称是 b'a'。有谁知道任何解决方法?我已经使用psycopg2 编写了使用普通字符串的代码,因此希望有一个不会对代码进行太多更改的解决方案。

编辑:

版本

Python = 3.9.7

红移连接器 = 2.0.889

熊猫 = 1.2.5

【问题讨论】:

【参考方案1】:

你可以用一行来解决这个问题

df.columns = [col.decode("utf-8") for col in df.columns]

或者不要使用pd.read_sql_query,而是使用文档中建议的连接方法

cursor: redshift_connector.Cursor = conn.cursor()
cursor.execute("SELECT * FROM table")

result: pd.DataFrame = cursor.fetch_dataframe()

【讨论】:

以上是关于Redshift python连接器列名称是字节字符串的主要内容,如果未能解决你的问题,请参考以下文章

Redshift 性能:连接列上的编码

Amazon Redshift:连接列内容略有不同的两列

Redshift Dist 键、IDentity 列或连接列?列的基数,用于排序键的联接考虑

如何在 Python 中 Redshift 的卸载命令中添加列标题?

如何散列整个 Redshift 表?

使用大表连接更新 Amazon Redshift 中的列