如何使用小部件在 Dataframe 选择语句中传递动态列名

Posted

技术标签:

【中文标题】如何使用小部件在 Dataframe 选择语句中传递动态列名【英文标题】:How to use widgets to pass dynamic column names in Dataframe select statement 【发布时间】:2021-04-14 15:42:12 【问题描述】:

我有一个 Dataframe,我想通过我的 Databricks Notebook 中的 select 语句中的小部件动态传递列名称。我该怎么做?

我正在使用下面的代码

df1 = spark.sql("select * from tableraw")

df1 有列“tablename”和“layer”

df = df1.select("tablename", "layer")

现在,我们的要求是使用小部件的值来选择这些列,例如:

df = df1.select(dbutils.widget.get("tablename"), dbutils.widget.get("datalayer"))

【问题讨论】:

【参考方案1】:

Python / Scala

创建小部件

%python
dbutils.widgets.text(name = "pythonTextWidget", defaultValue = "columnName")
dbutils.widgets.dropdown(name = "pythonDropdownWidget", defaultValue = "col1", choices = ["col1", "col2", "col3"])
%scala
dbutils.widgets.text("scalaTextWidget", "columnName")
dbutils.widgets.dropdown("scalaDropdownWidget", "col1", Seq("col1", "col2", "col3"))

从小部件中提取值

%python
textColumn = dbutils.widgets.get("pythonTextWidget")
dropdownColumn = dbutils.widgets.get("pythonDropdownWidget")
%scala
val textColumn = dbutils.widgets.get("scalaTextWidget")
val dropdownColumn = dbutils.widgets.get("scalaDropdownWidget")

使用值选择列

%python
from pyspark.sql.functions import col
df.select(col(textColumn), col(dropdownColumn))
%scala
import org.apache.spark.sql.functions.col
df.select(col(textColumn), col(dropdownColumn))

SQL

与 Python/Scala 相比,SQL 中的小部件的工作方式略有不同,因为您不能使用它们来选择列。但是,小部件可用于动态调整过滤器。

创建小部件

%sql CREATE WIDGET text sqlTextWidget DEFAULT "ACTIVE"
%sql CREATE WIDGET DROPDOWN sqlDropdownWidget DEFAULT "ACTIVE" CHOICES SELECT DISTINCT Status FROM <databaseName>.<tableName> WHERE Status IS NOT NULL

将小部件值应用于过滤语句

%sql SELECT * FROM <databaseName>.<tableName> WHERE Status = getArgument("sqlTextWidget")

更多背景信息可在 Widgets 上的 Databricks 文档中找到。

【讨论】:

以上是关于如何使用小部件在 Dataframe 选择语句中传递动态列名的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中使用带有容器小部件的 if 语句

在Streamlit中使用Python选择任何小部件后如何停止重新加载页面

如何在 matplotlib 小部件的嵌入式图形上使用跨度选择器?

如何在 yii2 中使用 select2 小部件选择多个值

选择选项卡小部件时如何连接事件?

如何清除 kivy 中的小部件?