Sql 配置单元-地图数据类型列上的联接

Sql 配置单元-地图数据类型列上的联接,sql,hadoop,hive,hiveql,Sql,Hadoop,Hive,Hiveql,我想对配置单元中映射列和名称上的表执行自联接。这样我就可以执行示例输出中所示的平衡差 我尝试加入,但它没有提供所需的列。我想了解join在我的案例图中是如何处理复杂数据类型的。看看这个 您必须使用稍后的VIEW EXPLODE语法来公开嵌套映射并在联接中使用它。现在在hive中,如果您事先知道mapcolumn的所有键,我们无法在映射数据类型上联接。您可以按t1.mapColumn['car']=t2.mapColumn['car']等方式输入所有键。。否则,请尝试使用以下命令: table

我想对配置单元中映射列和名称上的表执行自联接。这样我就可以执行示例输出中所示的平衡差

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

看看这个


您必须使用稍后的VIEW EXPLODE语法来公开嵌套映射并在联接中使用它。

现在在hive中,如果您事先知道mapcolumn的所有键,我们无法在映射数据类型上联接。您可以按t1.mapColumn['car']=t2.mapColumn['car']等方式输入所有键。。否则,请尝试使用以下命令:

 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
您可以使用侧视图分解为多行,但您将很难找到bal之间的差异,因为将有多行具有相同的bal


对于非空操作数,运算符将使用EQUAL=运算符返回相同的结果,但若两者都为空则返回TRUE,若其中一个为空则返回FALSE?你说没有提供所需的列是什么意思,即缺少什么?@mark91更新了更多详细信息。但之前不清楚地图的输入,我希望查询处理所有问题。我更新了答案,请检查它是否解决了你的问题。
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;