【问题标题】:String to Map Conversion Hive字符串到映射转换 Hive
【发布时间】:2014-05-26 05:27:35
【问题描述】:

我有一个有四列的表格。

C1    C2    C3    C4
--------------------
x1    y1    z1    d1
x2    y2    z2    d2

现在我想将其转换为具有键值对的地图数据类型并加载到单独的表中。

create table test
(
   level map<string,string>
)
row format delimited
COLLECTION ITEMS TERMINATED BY '&'
map keys terminated by '=';

现在我正在使用下面的 sql 来加载数据。

insert overwrite table test
select str_to_map(concat('level1=',c1,'&','level2=',c2,'&','level3=',c3,'&','level4=',c4) from input;

在表上选择查询。

select * from test;
{"level1":"x1","level2":"y1","level3":"z1","level4":"d1=\\"}
{"level1":"x2","level2":"y2","level3":"z2","level4":"d2=\\"}

我不明白为什么我在最后一个值中得到了额外的“=\ \”。

我仔细检查了数据,但问题仍然存在。

你能帮忙吗?

【问题讨论】:

    标签: hadoop map hive


    【解决方案1】:

    str_to_map(text, delimiter1, delimiter2) - 通过解析文本创建地图 使用两个分隔符将文本拆分为键值对。第一个分隔符分隔对,第二个分隔符分隔键和值。如果只给出一个参数,则使用默认分隔符:','delimiter1'='delimiter2

    您可以通过运行以下命令获取此信息:

    describe function extended str_to_map
    

    在您的语法中有两个错误:

    insert overwrite table test
    select str_to_map(concat('level1=',c1,'&','level2=',c2,'&','level3=',c3,'&','level4=',c4) from input;
    

    首先,缺少一个括号 )

    其次,它基本上不是错误,您没有给出分隔符,因此该函数采用分隔符的默认值,这就是您的结果中得到 ',' 的原因。

    要获得当前格式的输出,您应该尝试以下查询:

    insert overwrite table test
    select str_to_map(concat('level1=',c1,'&','level2=',c2,'&','level3=',c3,'&','level4=',c4),'&','=') from input;
    

    【讨论】:

    • 请注意delimiter1delimiter2 被传递给split,这意味着它们将被解释为正则表达式!
    猜你喜欢
    • 2017-01-16
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 2014-12-24
    相关资源
    最近更新 更多