【问题标题】:Combining two/four tables组合两个/四个表
【发布时间】:2020-02-17 15:03:36
【问题描述】:

我正在开发一个 spark 程序,它基本上是在尝试合并以下两个表:

表1


+---+---+---+  
| a | b | c |  
+---+---+---+  
| 1 | 2 | 6 |  
| 4 | 5 | 6 |  
+---+---+---+

表2:


+---------+-----+--------+  
|Attribute|Value|Validity|  
+---------+-----+--------+  
|    A    |  1  |  false |  
|    A    |  4  |  false |  
|    B    |  2  |  false |  
|    B    |  5  |  false |  
|    C    |  6  |  true  |  
+---------+-----+--------+  

我想查找每个(属性,值)对是否有效。 基本上,包含我需要的所有信息的结果表可能如下所示:

+-+-+-+---------+---------+---------+  
|A|B|C|ValidityA|ValidityB|ValidityC|  
+-+-+-+---------+---------+---------+  
|1|2|6|  false  |  false  |  true   |  
|4|5|6|  false  |  false  |  true   |  
+-+-+-+---------+---------+---------+  

在对表进行一些预处理后,例如通过三重连接可以实现上述表。但是三重连接对我来说似乎非常低效,因为我正在使用大数据。 此外,我必须使用循环来单独执行每个连接,这也是我不想要的。

有人知道用单个查询来存档上述结果的方法吗(额外的预处理和对表的简单更改没问题)?

我无法让格式正常工作,抱歉。

亲切的问候
-巴里

【问题讨论】:

  • 您可以转置 table1 并使用 pivot 执行单个连接。

标签: sql apache-spark apache-spark-sql bigdata rdd


【解决方案1】:

您可以join 表格,每个属性一次:

select t1.*,
       a.validity as validityA,
       b.validity as validityB,
       c.validity as validityC
from table1 t1 left join
     table2 a
     on t1.a = a.value and a.attribute = 'A' left join
     table2 b
     on t1.b = b.value and b.attribute = 'B' left join
     table2 c
     on t1.b = c.value and c.attribute = 'C';

注意:当table2 中没有匹配项时,这将返回NULL 有效性列值。

【讨论】:

  • 正如问题中所写,我希望有一种不同的方式,更高效的方式,因为我正在处理大数据
  • @Barry 。 . .从性能的角度来看,这可能很好。虽然我在您的问题中看到了对一种方法的引用,但我没有看到查询,所以我真的不能说这与您可能尝试过的有任何关系。
猜你喜欢
  • 2011-01-01
  • 2018-03-29
  • 2015-11-08
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 2020-02-19
  • 2011-12-07
  • 1970-01-01
相关资源
最近更新 更多