当前位置: 首页 > 知识库问答 >
问题:

为什么在SQL查询中使用UDF会导致笛卡尔积?

仲浩歌
2023-03-14

我看到Databricks问题,但不理解

  1. 为什么使用 UDF 会导致笛卡尔积而不是完全外连接?显然,笛卡尔积将比完全外连接(Joins 就是一个例子)多得多的行,这是一个潜在的性能影响。
  2. 有什么方法可以在Databricks-Question中给出的示例中强制在笛卡尔积上进行外部连接?

此处引用Databricks问题:

我有一个使用SQLContext对流数据执行SQL语句的Spark Streams应用程序。当我在Scala中注册自定义UDF时,流应用程序的性能会显着下降。详情如下:

声明1:

选择col1, col2 from table 1 as t1加入table le2 as t2 ont1.foo=t2.bar

声明2:

从表1中选择col1,col2作为t1连接表2作为t2等于(t1.foo,t2.bar)

我使用 SQLContext 注册了一个自定义 UDF,如下所示:

sqlc.udf.register(“equals”, (s1: String, s2:String) =

在相同的输入和Spark配置下,State2的性能比State1明显差(接近100X)。


共有1个答案

邰昀
2023-03-14
匿名用户

为什么使用UDF会产生笛卡尔积而不是完全外连接?

使用 UDF 需要笛卡尔积的原因很简单。由于您传递的任意函数可能具有无限域和非确定性行为,因此确定其值的唯一方法是传递参数并求值。这意味着您只需检查所有可能的配对。

另一方面,简单的平等具有可预测的行为。如果您使用< code>t1.foo = t2.bar条件,您可以简单地通过< code>foo和< code>bar分别混洗< code>t1和< code>t2行,以获得预期的结果。

准确地说,在关系代数中,外部连接实际上是用自然连接表示的。除此之外的任何东西都只是一种优化

任何在笛卡尔积上强制外连接的方法

不尽然,除非你想修改Spark SQL引擎。

 类似资料:
  • 问题内容: 我对SQL还是很陌生,并且正在为查询而苦苦挣扎(使用Access,FWIW)。我已经搜索并搜索了StackOverflow,但没有看到这种确切的情况。(这也可能是因为我不知道正确的搜索词。) 我有两个非常简单的表,其中包含相似的数据。 我想要的是在两个表以及该人所在的每个表的网络中找到匹配的每个人/州组合: 此人在每个表中可能位于多个网络中。我想查看此人所属的每个网络(从两个表中)。

  • 问题内容: 我正在编写一个PL / SQL过程,该过程需要动态生成一些查询,其中之一涉及使用来自查询的结果作为参数来创建临时表。 它可以正确编译,但是即使使用非常简单的查询,例如: IT抛出。如果我手动运行创建的查询,它将正确运行。在这一点上,我能够确定是什么导致了问题。 问题答案: 尝试丢掉“;” 从您立即执行的字符串内部。

  • 本文向大家介绍浅谈MySQL使用笛卡尔积原理进行多表查询,包括了浅谈MySQL使用笛卡尔积原理进行多表查询的使用技巧和注意事项,需要的朋友参考一下 MySQL的多表查询(笛卡尔积原理) 先确定数据要用到哪些表。 将多个表先通过笛卡尔积变成一个表。 然后去除不符合逻辑的数据(根据两个表的关系去掉)。 最后当做是一个虚拟表一样来加上条件即可。 注意:列名最好使用表别名来区别。 笛卡尔积 Demo: 左

  • 问题内容: 在Tensorflow中有什么简单的方法可以像itertools.product一样做笛卡尔积吗?我想获得两个张量(和)的元素组合,在Python中可以通过itertools作为。我正在Tensorflow中寻找替代方案。 问题答案: 我将在此假定和均为一维张量。 为了得到两者的笛卡尔积,我会用的组合和: 您使用LEN(一) LEN(B) 2张量,其中的元件的每个组合结束并且在最后一维

  • 问题内容: 我想找到元素集的笛卡尔积。这是一个例子 笛卡尔积是, abc aba acc aca bbc bba bcc bca 笛卡尔积是, zbc ybc xbc 因此,我正在考虑一种在Java中执行的算法,该算法可以在一开始就找到在编译时定义的特定数量组的笛卡尔积。 问题答案: 您可以使用该方法从谷歌的番石榴库生成笛卡尔产品: 如果一切都那么简单!

  • 问题内容: 我有一个无法执行的SQL查询: 该表的PK为(int)。该视图是对该表的查询,该表与其他一些表结合在一起以决定我们是否信任某个人。该视图只有一列:。 当我尝试执行此查询时,出现以下错误: 消息209,级别16,状态1,第3 行列名称“ CreatedDate”不明确。 我知道这个错误告诉我列名是不明确的,我需要在表的别名’p’开头。 该查询有效: 我不明白的是为什么我需要在语句中而不是