传递参数对SQL很有效,但对Python字符串中的Hadoop SQL无效

2024-04-26 08:11:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力将日期参数传递到我在Python中运行的SQL查询中。这些参数适用于我的常规SQL查询,但不适用于我的配置单元SQL查询,我不知道为什么?我收到“SQL包含0个参数标记,但提供了1个参数”错误,但仅适用于配置单元SQL。 此代码按预期运行:

    conn_sql = pyodbc.connect(f"DRIVER{{NetezzaSQL}};SERVER=server1;PORT=xxxx;DATABASE=SYSTEM;UID=xxxxxx;PWD=xxxxxx;")

# Define Cursor
cus_sql=conn_sql.cursor()

conn_hadoop = pyodbc.connect("DSN=Hive_Connection", autocommit=True)
start_date = input("Enter start date: ")
end_date = input("Enter end date: ")

sql = """SELECT user_id
    FROM table
    WHERE DATE_TIME >= CAST(? AS varchar(25)) AND a.DATE_TIME < CAST(? AS varchar(25))"""
df = pd.read_sql(sql,conn_sql,params=[start_date,end_date])

下面的代码抛出0参数错误

with pyodbc.connect("DSN=Hive_Connection", autocommit=True) as conn_hadoop:
    df = pd.read_sql("""SELECT user_id
    FROM table
    WHERE date_time >= ? and date_time < end_time
    """,conn_hadoop,params=[start_time,end_time])

我不知道是什么原因造成的。为配置单元连接传递参数是否需要其他格式?在我的搜索中,我没有看到这方面的任何东西,但也许我错过了


Tags: 代码hadoopsql参数datetimeconnect错误
2条回答

在Rishu的帮助下,找到了一种在执行前使用SQL字符串和.format()替换参数的方法

sql = """SELECT user_id
    FROM table
    WHERE date_time >= '{}' and date_time < '{}'
    """.format(start_date,end_date)

with pyodbc.connect("DSN=Hive_Connection", autocommit=True) as conn_hadoop:
    df = pd.read_sql(sql,conn_hadoop)

"The SQL contains 0 parameter markers, but 1 parameters were supplied" error

此错误主要是因为配置单元无法检测到任何参数的存在。在配置单元查询中传递参数的方法是使用${hiveconf:<param name>}。因此,基本上您在配置单元中的查询如下所示:

with pyodbc.connect("DSN=Hive_Connection", autocommit=True) as conn_hadoop:
   df = pd.read_sql("""SELECT user_id
           FROM table
           WHERE date_time >= '${hiveconf:start_time}' and date_time < '${hiveconf:end_time}'
        """,conn_hadoop,params=[start_time,end_time])

How to set variables in HIVE scripts上检查此答案

相关问题 更多 >