如何动态生成PySpark DataFrame名称并解决赋值语法错误
问题解决:动态生成DataFrame名称并存储查询结果
你想要根据数据库表中的VENDOR_NAME动态生成DataFrame(如dnb_df、es_df)并存储对应查询结果,但运行代码时出现语法错误:
SyntaxError: can't assign to operator (TestGlue2.py, line 66)
错误原因
直接用row.VENDOR_NAME+'_df'作为变量名赋值是非法的,Python不允许将表达式作为变量名使用——变量名必须是固定的合法标识符,不能是动态拼接的字符串。
解决方案
使用字典来存储动态生成的DataFrame是最安全、易维护的方式,避免直接操作全局命名空间的风险。修改循环部分代码如下:
修改后的核心代码段
# 初始化字典存储动态DataFrame vendor_dfs = {} source_df = spark.read.format("jdbc").option("url", Oracle_jdbc_url).option("dbtable", "(select * from schema.table order by VENDOR_EXECUTION_ORDER) ").option("user", Oracle_Username).option("password", Oracle_Password).load() vendor_data = source_df.collect() for row in vendor_data: vendor_query = row.SRC_QUERY df_name = f"{row.VENDOR_NAME}_df" # 将查询结果存入字典,键为动态生成的DataFrame名称 vendor_dfs[df_name] = spark.read.format("jdbc").option("url", Oracle_jdbc_url).option("dbtable", vendor_query).option("user", Oracle_Username).option("password", Oracle_Password).load() # 打印DataFrame结构 print(f"===== {df_name} 结构 =====") vendor_dfs[df_name].printSchema() # 后续可通过字典键名访问对应DataFrame,例如 vendor_dfs['dnb_df']
补充说明
- 如果
source_df数据量较大,不建议使用collect(),该方法会将全量数据加载到Driver节点内存中,可能引发内存溢出。可改用source_df.foreach(lambda row: ...)或foreachPartition实现分布式处理。 - 字典存储方式便于统一管理所有动态生成的DataFrame,避免变量名冲突或全局命名空间混乱。
内容的提问来源于stack exchange,提问作者pbh
相关产品推荐
相关产品推荐

