Hive Struct to String转换

时间:2016-11-03 07:22:09

标签: hadoop struct hive hiveql

我有一个包含结构的表 - 让我们说:

create external table table1 ( 
    a int,
    b STRUCT <c:double,d:double>,
    e string
)

我在这张桌子上执行选择并获得类似 -

的内容
  

1100 {&#34; c&#34;:12.3,&#34; d&#34;:45.6} str

但是当我将这些数据插入另一个表时 -

create external table table2 (
    a string,
    b string,
    c string
)

insert overwrite table table2
select a,b,c
from table1;

我得到以下奇怪的行为,表明hive中struct和string之间的转换没有按预期工作

select * from table2;

会导致 -

  

1100 12.345.6 str

结果是结构中值的一种奇怪的连接,甚至在处理更复杂的结构时发生了奇怪的事情

  1. 有没有办法阻止这种自动转换?在这种情况下让hive抛出错误?

  2. 是否有一种干净的方法可以将此自动转换更改为不同的工作方式?

1 个答案:

答案 0 :(得分:2)

  1. 直接调用insert overwrite table table2 select a,b,c from table1;时,我们无法阻止自动转换。背后发生的事情只是concat来自struct的所有值。

  2. 您可以编写通用UDF以使用struct参考:http://www.dataiku.com/blog/2013/05/01/a-complete-guide-to-writing-hive-udf.html

  3. 更快的方式:

    如果您打算从struct中获取值并将其存储为原始值,请尝试如下,

    create external table table2 (
        a string,
        b_c string,
        b_d string,
        c string
    )
    
    insert overwrite table table2
    select a,b.c,b.e,c
    from table1;
    

    如果有帮助,请告诉我。