Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hive 比较配置单元HQL中A列的一个值与B列的所有值_Hive_Hiveql - Fatal编程技术网

Hive 比较配置单元HQL中A列的一个值与B列的所有值

Hive 比较配置单元HQL中A列的一个值与B列的所有值,hive,hiveql,Hive,Hiveql,我在一个表中有两列,即A列和B列。我每次都需要使用B列的所有值搜索A列的每个值,如果在B列的任何一行中找到A列值,则返回true。我如何获得此结果 我已尝试使用以下命令: select column _A, column_B,(if (column_A =column_B), True, False) as test from sample; 如果我使用上面的命令,它只检查特定的行。但如果在B列的任何一行中找到a列的值,我需要真值。 如何检查A列的一个值与B列的所有值 或者是否有可能在两列之间

我在一个表中有两列,即A列和B列。我每次都需要使用B列的所有值搜索A列的每个值,如果在B列的任何一行中找到A列值,则返回true。我如何获得此结果

我已尝试使用以下命令:

select column _A, column_B,(if (column_A =column_B), True, False) as test from sample;
如果我使用上面的命令,它只检查特定的行。但如果在B列的任何一行中找到a列的值,我需要真值。 如何检查A列的一个值与B列的所有值


或者是否有可能在两列之间迭代和比较每个值?

您可以对其自身进行左连接,并检查列键是否为空。如果为空,则在另一个表中找不到该值。使用if或“case-when”函数检查它是否为null

Select t1.column_A,
          t1.column_B,
         IF(t2.column_B is null, 'False', 'True') as test
from Sample t1
Left Join Sample t2
On t1.column_A = t2.column_B;
解决方案 从sample创建临时表t作为id,列A,列B;-->参考1

选择
distinct
t3.id,t3.column_A,t3.column_B,t3.match from(-->参考3

select t1.id as id, t1.column_A as column_A, t1.column_B as column_B,--> Refer 2 
if(t2.column_B is null, False, True) as match  from t t1 LEFT OUTER JOIN
   t t2  ON t1.column_A = t2.column_B 
)t3

解释
  • 创建一个标识符列以跟踪原始表中的行。我在这里使用的是
    rand()
    。我们将利用这一点在步骤3中获取原始行。为了在接下来的步骤中简化,在此处创建一个临时表
    t
  • 使用self的
    左外部联接
    进行测试,该测试要求在所有行中将每一列与另一列进行匹配,从而生成
    匹配
    列。请注意,这里可能会创建多个重复行,而不是在
    Sample
    表中创建,但我们对重复行有一个句柄,因为它们的
    id
    列是相同的

  • 在这一步中,我们应用
    distinct
    来获取原始行,如
    Sample
    表中所示。然后可以放弃
    id

  • 笔记
  • 自联接在性能方面代价高昂,但这对于问题的解决是不可避免的
  • 步骤3中使用的
    独特的
    ,成本也很高。一种更有效的方法是使用窗口函数,我们可以通过
    id
    进行分区,并选择窗口中的第一行。你可以探索一下

  • 如果特定的
    t1.列a
    t2.列B