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
只接受字符串,而choices
是Sequence
。我知道这是 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 子句中使用的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Fragments 中使用 setArguments() 和 getArguments() 方法?
environment.getArgument 无法在 graphql-java 中转换为我自己的 java 对象
databricks-connect 无法连接到 Databricks 集群运行时 8.4