我在处理Python Teradata(tdodbc)查询时遇到麻烦,因为该查询会使用不同的变量遍历同一查询并合并结果。我在另一个post中得到了良好的指导,并最终到了这里。我现在的问题是,数据框仅以循环“ state5”中最终变量的查询结果结束。不幸的是,我们在各自的数据库中具有相同模式的5个状态。我可以运行相同的查询,但是想循环变量,以便可以针对所有5种状态运行并返回附加查询。使用SAS宏变量和修补很容易,但是需要将数据引入python以进行EDA和数据科学。
from teradata import tdodbc
udaExec = td.UdaExec(appConfigFile="udaexec.ini")
with udaExec.connect("${dataSourceName}") as session:
state_dataframes = []
STATES = ["state1", "state2", "state3", "state4", "state5"]
for state in STATES:
query1 = """database my_db_{};"""
query2 = """
select top 10
'{}' as state
,a.*
from table_a
"""
session.execute(query1.format(state))
session.execute(query2.format(state))
state_dataframes.append(pd.read_sql(query2, session))
all_states_df = pd.concat(state_dataframes)
我终于可以使它起作用,尽管这可能不是最雄辩的方法。我确实尝试将删除表作为单个变量“ query5”进行处理,但收到DDL错误。一旦我将每个放置表分离到它自己的session.execute中,它就起作用了。
udaExec = td.UdaExec(appConfigFile="udaexec.ini")
with udaExec.connect("${dataSourceName}") as session:
state_dataframes = []
STATES = ["state1", "state2", "state3", "state4", "state5"]
for state in STATES:
query1 = """database my_db_{};"""
query2 = """
create set volatile table v_table
,no fallback, no before journal, no after journal as
(
select top 10
'{}' as state
,t.*
from table t
)
with data
primary index (dw_key)
on commit preserve rows;
"""
query3 = """
create set volatile table v_table_2
,no fallback, no before journal, no after journal as
(
select t.*
from v_table t
)
with data
primary index (dw_key)
on commit preserve rows;
"""
query4 = """
select t.*
from v_table_2 t
"""
session.execute(query1.format(state))
session.execute(query2.format(state))
session.execute(query3)
state_dataframes.append(pd.read_sql(query4, session))
session.execute("DROP TABLE v_table")
session.execute("DROP TABLE v_table_2")
all_states_df = pd.concat(state_dataframes)
为了清楚起见,编辑该问题只需要适当的缩进即可。在我的Teradata环境中,假脱机空间有限,这需要构建许多卷表才能拆分查询。由于我花费了大量时间尝试解决此问题,因此我在答案中添加了帮助其他可能遇到这种情况的人。