gpt4 book ai didi

user-defined-functions - Hive:将逗号分隔的字符串转换为表生成函数的数组

转载 作者:行者123 更新时间:2023-12-01 12:48:57 27 4
gpt4 key购买 nike

我正在使用 gzip 压缩的 JSON 编码文件在 Amazon 的 Elastic MapReduce 上创建一个 Hive 表。我正在使用这个 JSON SerDe:http://code.google.com/p/hive-json-serde/

未编码的文件如下所示:

{"id":"101", "items":"A:231,234,119,12"}

{"id":"102", "items":"B:13,89,121"}

...

我想为具有表格生成功能的用户创建一个“items”列的数组。我想要的数组将是忽略“:”和它前面的字母的整数的“分解”CSV。我希望能够对项目整数(231,234 等)进行 GROUP BY 或将它们与其他表进行 JOIN。改变这个文件的格式会很困难,我所有的旧数据都以这种格式存储,所以我想在 Hive 中解决这个问题而不改变我的数据的存储方式。

我有办法做到这一点吗?

编辑:

感谢@mark-grover,这成功了!

我做了这样的事情:

SELECT id, item FROM my_table LATERAL VIEW explode(split(substr(items, 3, length(items) - 2), ',')) t1 AS item

得到:

101 231

101 234

101 119

101 12

102 13

102 89

102 121

在这样做的过程中,我发现我还想多做一点。我还想选择每个项目在 CSV 中的位置。所以我希望输出看起来像:

101 231 0

101 234 1

101 119 2

101 12 3

102 13 1

102 89 2

102 121 3

这里有什么想法吗?

再次编辑:

我为我的后续问题想出了一些东西,做这样的事情:

SELECT id, item, find_in_set(item, substr(items, 3, length(items) - 2)) AS position
FROM my_table LATERAL VIEW explode(split(substr(items, 3, length(items) - 2), ',')) t1 AS item

最佳答案

您可以使用 Hive UDFs 来做到这一点.您可能希望使用拆分 UDF 以逗号拆分字符串以获取数组,然后使用 Lateral view along with explode UDTF “分解”数组的内容。

回答你的第二个问题:这是我现在能想到的。可能有更好/更容易/更少 hackier 的方法来做到这一点。

创建一个 UDF,比如 split_extended,它将作为具有 2 个元素的结构返回,第一个是数组元素的实际内容,第二个是索引。当你分解它时,分解列的类型将是一个结构。该结构的一个条目是数组中的实际元素,另一个条目是对应于该元素的索引。

如果您考虑一下,我们正在扩充拆分 UDF 以返回 2 条信息 - 元素和索引。这些是将此类信息作为单个对象返回的几种方法 - 结构是其中之一,数组是另一种(数组的第一个元素是数组中的实际元素,第二个元素是索引)。返回 2 条信息的另一种黑客方法是将它们与您知道数据中不存在的内容(例如“:”)连接起来,这样您就可以让 UDF 返回“231:0”、“234:0” '、'119:2' 等,最后,您可以根据“:”(使用拆分 UDF)拆分结果字符串,而不是访问它们的结构成员,以获得所需的两部分。

为了创建您自己的 UDF,您将能够利用大部分(如果不是全部)可用的拆分 UDF 代码 here .

关于user-defined-functions - Hive:将逗号分隔的字符串转换为表生成函数的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13754648/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com