【问题标题】:Hive - Join on map data type columnHive - 加入地图数据类型列
【发布时间】:2015-12-02 16:33:21
【问题描述】:
 table 1 - 

    name bal map<String,String> year   

    abc 24000   {car : honda, company : boa} 2015
    ac 21000  { car:honda} 2015
    def 23000 {car:honda, company: boa} 2015
    abc 21000   {car : honda, company : boa} 2014
    ac 20000  { car:honda} 2014
    def 22000 {car:honda, company: boa} 2014

        Required Output after self join -  

        name bal-difference map<String,String> 
        abc 3000 {car : honda, company : boa} 
        ac 1000 { car:honda} 
        def 1000 {car:honda, company: boa} 



    select 
    t1.name,t1.mapColumn,(t1.bal-t2.bal)
    FROM  table1 t1 JOIN table1 t2 
    ON t1.mapColumn = t2.mapColumn and t1.name = t2.name

我想对地图列上的表和 hive 中的名称执行自联接。这样我就可以执行示例输出中看到的平衡差异。

我尝试加入,但它没有提供所需的列。我想了解 join 如何处理复杂的数据类型(在我的案例中)。

【问题讨论】:

  • 你做了什么? “没有提供必需的列”是什么意思,即它缺少什么?
  • @mark91 更新了更多细节。

标签: sql hadoop hive hiveql


【解决方案1】:

看看这个 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+LateralView

您必须使用 LATER VIEW EXPLODE 语法来公开嵌套映射并在 JOIN 中使用它。

【讨论】:

    【解决方案2】:

    到目前为止,如果您事先知道 mapcolumn 的所有键,则在 hive 中我们无法加入 map 数据类型。您可以将所有键键入为 t1.mapColumn['car'] = t2.mapColumn['car'] 等。否则尝试使用以下:

    select t1.name ,t1.mapColumn ,(t1.bal - t2.bal)
    FROM (select * from table1 where tran_year = '2015') t1 
    JOIN (select * from table1 where tran_year = '2014') t2 
    ON    map_keys(t1.mapColumn) <=> map_keys(t2.mapColumn)  
    and   map_values(t1.mapColumn) <=> map_values(t2.mapColumn)
    and   t1.name = t2.name;
    

    您可以使用横向视图将其分解为多行,但您将很难找到 bal 之间的差异,因为会有多行具有相同的 bal。

    &lt;=&gt; 运算符对于非空操作数将返回与 EQUAL= 运算符相同的结果,但如果两者都为 NULL,则返回 TRUE,如果其中之一为 NULL,则返回 FALSE

    【讨论】:

    • 但是之前对map中的key不太了解,我希望查询来处理所有事情。
    • 我更新了答案,请检查它是否解决了您的问题。
    猜你喜欢
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多