Databricks getArgument 值不能在 Spark SQL IN 子句中使用

Posted

技术标签:

【中文标题】Databricks getArgument 值不能在 Spark SQL IN 子句中使用【英文标题】:Databricks getArgument value cannot be used within Spark SQL IN clause 【发布时间】:2019-05-08 21:31:03 【问题描述】:

我从 databricks 笔记本小部件中获取逗号分隔的字符串列表,但我无法在 Spark SQL 的 IN 子句中使用该值

我在笔记本中的 %sql 单元格中,并且不想跳转到 %py 或 %scala 单元格类型。

另外,我不能在 IN 子句中使用 select 语句,因为 IN 子句不在选择过滤器中。如果您尝试该语法,则会出现错误:“IN/EXISTS 谓词子查询只能在过滤器中使用”。

这里的 ITEM 是在 %sql 单元格中这样创建的小部件

创建小部件文本项目默认“'0111','0112'”

select *
from items_table
where ItemSKU in (string(getArgument("ITEM")));

select *
from items_table
where ItemSKU in (getArgument("ITEM"));

它不返回任何行

但是如果我直接替换代码中逗号分隔字符串的值,即

select *
from items_table
where ItemSKU in ('0111','0112');

我得到了预期的结果。

【问题讨论】:

【参考方案1】:

这是可能的,试试:

...
WHERE ItemSKU IN (SELECT explode(split(getArgument("ITEM"),',')))

这也适用于多选小部件。

如果允许您的用户直接输入文本,则文本小部件选项将容易出现用户错误。

【讨论】:

【参考方案2】:

我认为您不能将多个项目作为multiselect 小部件的默认值,并且绝对不能将text 小部件作为默认值。

如果你看multiselect函数的签名

multiselect(name: String, defaultValue: String, choices: Seq, label: String)

您可以看到defaultValue 只接受字符串,而choicesSequence。我知道这是 scala 函数,您正在寻找 SQL 版本,但这意味着并不意味着有一个 multiselect 默认选项,但实际上有多个选择。

链接 - https://docs.databricks.com/user-guide/dev-tools/dbutils.html

【讨论】:

嗨@big_mike_boiii,该小部件不是多选小部件,它只是一个文本小部件。我想发送一个包含多个值的字符串——这些值在 SQL IN 子句中有效,例如'0111','0112' - 我应该能够通过文本小部件发送这些值。我不确定为什么 SQL IN 子句不带 getArgument

以上是关于Databricks getArgument 值不能在 Spark SQL IN 子句中使用的主要内容,如果未能解决你的问题,请参考以下文章

片段 getArguments() 空指针异常

如何在 Fragments 中使用 setArguments() 和 getArguments() 方法?

environment.getArgument 无法在 graphql-java 中转换为我自己的 java 对象

databricks-connect 无法连接到 Databricks 集群运行时 8.4

通过 Python 中的 Databricks api 读取 Databricks 表?

Azure Databricks:如何在 Databricks 群集中添加 Spark 配置