【问题标题】:Passing parameter works fine for SQL but not Hadoop SQL in Python string传递参数适用于 SQL,但不适用于 Python 字符串中的 Hadoop SQL
【发布时间】:2020-07-02 04:55:14
【问题描述】:

我正在努力将日期参数传递到我在 Python 中运行的 SQL 查询中。这些参数适用于我的常规 SQL 查询,但不适用于我的 Hive SQL 查询,我不知道为什么?我收到“SQL 包含 0 个参数标记,但提供了 1 个参数”错误,但仅适用于 Hive 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])

我不知道是什么原因造成的。我是否需要不同的格式来为 Hive 连接传递参数?我在搜索中没有看到任何内容,但也许我错过了。

【问题讨论】:

    标签: python sql hive hiveql


    【解决方案1】:

    “SQL 包含 0 个参数标记,但提供了 1 个参数”错误

    这个错误主要是因为 hive 无法检测到任何参数的存在。在 hive 查询中传递参数的方法是使用${hiveconf:&lt;param name&gt;}。所以基本上你在蜂巢中的查询如下:

    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查看这个答案

    【讨论】:

    • 我在一些本地 Hive 代码中看到了这一点。我尝试在我的 SQL 中使用它,在 hiveconf 周围使用和不使用单引号,但该语句仍然看到 0 参数。
    • 对不起我的错误。你需要包括单引号。更新了我的答案。如果还是不行。在通过 pyodbc 执行之前,您可以尝试使用 sql 查询的字符串替换来更新参数。
    • 是的,我尝试使用单引号,但仍然没有运气。在执行查询之前用 .format() 替换 SQL 字符串中的参数确实有效。这是个好主意,谢谢。
    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 2017-01-06
      • 2014-07-13
      • 1970-01-01
      • 2019-12-23
      相关资源
      最近更新 更多