如何解析 Pig 中的复杂数据类型
how to parse complex data type in Pig
我有一个 input.txt 如下所示:
{"zone_id":12,"position":[100,200,300]}
{"zone_id":14,"position":[101,201,0]}
我的问题是如何获得如下所示的输出:
(12, 100, 200, 300)
(14, 101, 201, 0)
感谢您的回答!
有很多方法可以解决这个问题,但我认为最简单的方法是使用 REGEX_EXTRACT_ALL。
A = LOAD B FROM '...' USING TextLoader() AS (line:chararray);
B = FOREACH A GENERATE
REGEX_EXTRACT_ALL(line, '^..zone_id..(\d*)..position..(\d*),(\d*),(\d*)..$');
此方法使用 TextLoader
一次读取一行(以换行符分隔)到 chararray
中。
接下来,FOREACH...GENERATE
应用 REGEX_EXTRACT_ALL
,它将括号内的每个组拉出并 returns 将其放入一个元组中。现在你可以随心所欲了。
注意你的数据是否改变了形式。如果是这样,您将不得不编写更灵活的正则表达式。
如果你想处理数字而不是字符串,你可以 cast 它们。
我在这里全部使用了 REGEX_EXTRACT_ALL
,因为我假设您的数据每次都会有些相似。如果您想要更强大的解决方案,可以查看 JsonLoader
。您可以将数据映射到模式,然后将它 returns 的嵌套字段投影到列中。
This seems like a reasonable blog post on the subject.
免责声明:我无法测试此正则表达式,但希望您能理解。另外,我很懒惰,使用点而不是特定字符。
我有一个 input.txt 如下所示:
{"zone_id":12,"position":[100,200,300]}
{"zone_id":14,"position":[101,201,0]}
我的问题是如何获得如下所示的输出:
(12, 100, 200, 300)
(14, 101, 201, 0)
感谢您的回答!
有很多方法可以解决这个问题,但我认为最简单的方法是使用 REGEX_EXTRACT_ALL。
A = LOAD B FROM '...' USING TextLoader() AS (line:chararray);
B = FOREACH A GENERATE
REGEX_EXTRACT_ALL(line, '^..zone_id..(\d*)..position..(\d*),(\d*),(\d*)..$');
此方法使用 TextLoader
一次读取一行(以换行符分隔)到 chararray
中。
接下来,FOREACH...GENERATE
应用 REGEX_EXTRACT_ALL
,它将括号内的每个组拉出并 returns 将其放入一个元组中。现在你可以随心所欲了。
注意你的数据是否改变了形式。如果是这样,您将不得不编写更灵活的正则表达式。
如果你想处理数字而不是字符串,你可以 cast 它们。
我在这里全部使用了 REGEX_EXTRACT_ALL
,因为我假设您的数据每次都会有些相似。如果您想要更强大的解决方案,可以查看 JsonLoader
。您可以将数据映射到模式,然后将它 returns 的嵌套字段投影到列中。
This seems like a reasonable blog post on the subject.
免责声明:我无法测试此正则表达式,但希望您能理解。另外,我很懒惰,使用点而不是特定字符。