Writing dataframe via sql query (pyodbc): pyodbc.Error: ('HY004', '[HY004])
Writing dataframe via sql query (pyodbc): pyodbc.Error: ('HY004', '[HY004])
我想将数据框解析为 sql table 中的两个预定义列。 sql 中的架构是:
abc(varchar(255))
def(varchar(255))
使用这样的数据框:
df = pd.DataFrame(
[
[False, False],
[True, True],
],
columns=["ABC", "DEF"],
)
而 sql 查询是这样的:
with conn.cursor() as cursor:
string = "INSERT INTO {0}.{1}(abc, def) VALUES (?,?)".format(db, table)
cursor.execute(string, (df["ABC"]), (df["DEF"]))
cursor.commit()
以便查询(字符串)看起来像这样:
'INSERT INTO my_table(abc, def) VALUES (?,?)'
这会产生以下错误消息:
pyodbc.Error: ('HY004', '[HY004] [Cloudera][ODBC] (11320) SQL type not supported. (11320) (SQLBindParameter)')
所以我尝试在 Impala 编辑器中使用直接查询(不是通过 Python),如下:
'INSERT INTO my_table(abc, def) VALUES ('Hey','Hi');'
并产生此错误消息:
AnalysisException: Possible loss of precision for target table 'my_table'. Expression ''hey'' (type: `STRING) would need to be cast to VARCHAR(255) for column 'abc'`
为什么我连 table 简单的字符串都不能插入,比如 "Hi"?我的模式设置正确还是其他?
STRING
输入 Impala 的大小限制为 2GB。
VARCHAR
的长度是您定义的任何长度,但不超过 64KB。
因此,如果您将一个隐式转换为另一个,则可能会丢失数据。
默认情况下,文字被视为类型 STRING
。因此,为了将文字插入 VARCHAR
字段,您需要适当地 CAST
它。
INSERT INTO my_table(abc, def) VALUES (CAST('Hey' AS VARCHAR(255)),CAST('Hi' AS VARCHAR(255)));
我想将数据框解析为 sql table 中的两个预定义列。 sql 中的架构是:
abc(varchar(255))
def(varchar(255))
使用这样的数据框:
df = pd.DataFrame(
[
[False, False],
[True, True],
],
columns=["ABC", "DEF"],
)
而 sql 查询是这样的:
with conn.cursor() as cursor:
string = "INSERT INTO {0}.{1}(abc, def) VALUES (?,?)".format(db, table)
cursor.execute(string, (df["ABC"]), (df["DEF"]))
cursor.commit()
以便查询(字符串)看起来像这样:
'INSERT INTO my_table(abc, def) VALUES (?,?)'
这会产生以下错误消息:
pyodbc.Error: ('HY004', '[HY004] [Cloudera][ODBC] (11320) SQL type not supported. (11320) (SQLBindParameter)')
所以我尝试在 Impala 编辑器中使用直接查询(不是通过 Python),如下:
'INSERT INTO my_table(abc, def) VALUES ('Hey','Hi');'
并产生此错误消息:
AnalysisException: Possible loss of precision for target table 'my_table'. Expression ''hey'' (type: `STRING) would need to be cast to VARCHAR(255) for column 'abc'`
为什么我连 table 简单的字符串都不能插入,比如 "Hi"?我的模式设置正确还是其他?
STRING
输入 Impala 的大小限制为 2GB。
VARCHAR
的长度是您定义的任何长度,但不超过 64KB。
因此,如果您将一个隐式转换为另一个,则可能会丢失数据。
默认情况下,文字被视为类型 STRING
。因此,为了将文字插入 VARCHAR
字段,您需要适当地 CAST
它。
INSERT INTO my_table(abc, def) VALUES (CAST('Hey' AS VARCHAR(255)),CAST('Hi' AS VARCHAR(255)));