【问题标题】:How to do a for or while loop in Databricks SQL如何在 Databricks SQL 中执行 for 或 while 循环
【发布时间】:2021-12-25 06:31:31
【问题描述】:

有谁知道如何在 Databricks 的 SQL 中编写 for 或 while 循环?我已经尝试了以下 SQL Server 类型代码的许多变体,但似乎没有任何效果。我似乎也找不到任何参考。我不希望在 PySpark 中执行此操作,因为我需要将输出提供给更多 SQL 代码。

DECLARE @Counter INT 
SET @Counter=1
WHILE ( @Counter <= 10)
BEGIN
    PRINT 'The counter value is = ' + @Counter
    SET @Counter  = @Counter  + 1
END

任何建议将不胜感激。

谢谢。

【问题讨论】:

  • 请说明您想要达到的目标。您要执行的这段代码是数据帧/表上的databricks sql?或者你想在 t-sql 端执行代码?
  • 您好,感谢您的回复。我有一个 PySpark 代码,它生成一个由表名组成的表;它使用 SQL 'show tables' 代码来执行此操作。然后我想对这些表进行编号(可能使用 row_number()),然后在更多 SQL 代码的“from”子句中循环遍历该表中的每个表,以便我可以对表中列出的所有表执行相同的计算。

标签: sql loops for-loop while-loop databricks


【解决方案1】:

要实现这一点,只需将所有表从 SQL 获取到数据帧中,并使用 collect 将每个表获取到数据帧中:

# import necessary libraries
import os
from pyspark.sql.functions import udf, col
from pyspark.sql.types import IntegerType

# get list of tables from SQL, for MySQL syntax you can use just SHOW TABLES
df_tables = spark.read.jdbc(url=os.environ['SQL_JDBC_URL'], table="""(SELECT
  *
FROM
  SYSOBJECTS
WHERE
  xtype = 'U') x""")

# register function
def create_df(table):
  
  globals()[table] = spark.read.jdbc(url=os.environ['SQL_JDBC_URL'], table=table)
  return globals()[table].count()

# for each name from table list create dataframe using function
for value in df_tables.select("name").collect():
  create_df(value['name'])

【讨论】:

  • 非常感谢您的回复,是否没有纯 SQL 等效的方法?我需要了解更多 PySpark methinks!
【解决方案2】:

Databricks SQL 支持仅适用于基本 SQL 查询。因此,当前 Databricks SQL 版本不支持面向过程的查询。这将属于新功能请求。

注意:Databricks SQL 为希望在其数据湖上运行快速即席查询、创建多种可视化类型以从不同角度探索查询结果并构建和构建的 SQL 用户提供简单的体验。分享 仪表板。它不应该取代我们目前正在处理的在 Python/PySpark 中运行的 ETL 工作负载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 2019-09-25
    • 2021-07-27
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    相关资源
    最近更新 更多