Databricks中PySpark SQL如何查询名称相似的指定前缀表数据
问题根因
之前执行的语句无法运行有两个核心问题:
- Spark SQL原生不支持
FROM *语法,不能直接用通配符匹配FROM子句后的多张表 - SQL标准LIKE语法中,匹配任意长度字符的通配符是
%而非*,*是文件系统/Shell的通配符,不能直接在SQL里用
实现方案
你的3张Table_前缀表结构完全一致,直接用UNION ALL合并全量数据即可,这是最稳定、性能最优的写法:
# 固定表名写法,适合表数量固定的场景 merge_df = spark.sql(""" SELECT * FROM Table_A UNION ALL SELECT * FROM Table_B UNION ALL SELECT * FROM Table_C """) # 查看合并后的数据 merge_df.show()
如果后续Table_前缀的表会动态新增/删除,不想每次手动修改SQL,可以通过Spark Catalog先拉取所有符合命名规则的表,动态拼接查询语句:
# 获取当前会话下所有以Table_为前缀的表名 table_list = [table.name for table in spark.catalog.listTables() if table.name.startswith("Table_")] # 拼接UNION ALL查询语句 dynamic_sql = " UNION ALL ".join([f"SELECT * FROM {tbl}" for tbl in table_list]) merge_df = spark.sql(dynamic_sql)
注意事项
- 上述方案要求所有匹配到的
Table_前缀表字段数量、字段顺序、字段类型完全对齐,否则会抛出字段不匹配错误,当前环境下的Table_A、Table_B、Table_C结构完全一致,可直接运行 - 由于这三张表的Column_D字段固定存储自身表名,只要表名匹配
Table_前缀就不需要额外加WHERE条件过滤 - 如果后续有结构不一致的Table_前缀表,需要在拼接SQL时显式指定对齐的字段名,不要用
SELECT *
内容的提问来源于stack exchange,提问作者Dicer
相关产品推荐
相关产品推荐

