gpt4 book ai didi

json - 解析Hadoop中包含的复杂Json字符串

转载 作者:行者123 更新时间:2023-12-02 21:31:45 28 4
gpt4 key购买 nike

我想在Pig中解析一串复杂的JSON。具体来说,我希望Pig将我的JSON数组理解为一个包,而不是单个chararray。我发现可以使用Twitter's Elephant BirdMozilla's Akela库来解析复杂的JSON。 (我发现了一些其他库,但由于使用HCatalog Loader从Hive加载数据,因此无法使用基于“Loader”的方法。)

但是,问题出在我的数据结构上。 Map结构的每个值都包含复杂JSON的值部分。例如,

1. My table looks like  (WARNING: type of 'complex_data' is not STRING, a MAP of <STRING, STRING>!)
TABLE temp_table
(
user_id BIGINT COMMENT 'user ID.',
complex_data MAP <STRING, STRING> COMMENT 'complex json data'
)
COMMENT 'temp data.'
PARTITIONED BY(created_date STRING)
STORED AS RCFILE;


2. And 'complex_data' contains (a value that I want to get is marked with two *s, so basically #'d'#'f' from each PARSED_STRING(complex_data#'c') )
{ "a": "[]",
"b": "\"sdf\"",
"**c**":"[{\"**d**\":{\"e\":\"sdfsdf\"
,\"**f**\":\"sdfs\"
,\"g\":\"qweqweqwe\"},
\"c\":[{\"d\":21321,\"e\":\"ewrwer\"},
{\"d\":21321,\"e\":\"ewrwer\"},
{\"d\":21321,\"e\":\"ewrwer\"}]
},
{\"**d**\":{\"e\":\"sdfsdf\"
,\"**f**\":\"sdfs\"
,\"g\":\"qweqweqwe\"},
\"c\":[{\"d\":21321,\"e\":\"ewrwer\"},
{\"d\":21321,\"e\":\"ewrwer\"},
{\"d\":21321,\"e\":\"ewrwer\"}]
},]"
}

3. So, I tried... (same approach for Elephant Bird)

REGISTER '/path/to/akela-0.6-SNAPSHOT.jar';
DEFINE JsonTupleMap com.mozilla.pig.eval.json.JsonTupleMap();

data = LOAD temp_table USING org.apache.hive.hcatalog.pig.HCatLoader();
values_of_map = FOREACH data GENERATE complex_data#'c' AS attr:chararray; -- IT WORKS

-- dump values_of_map shows correct chararray data per each row
-- eg) ([{"d":{"e":"sdfsdf","f":"sdfs","g":"sdf"},... },
{"d":{"e":"sdfsdf","f":"sdfs","g":"sdf"},... },
{"d":{"e":"sdfsdf","f":"sdfs","g":"sdf"},... }])
([{"d":{"e":"sdfsdf","f":"sdfs","g":"sdf"},... },
{"d":{"e":"sdfsdf","f":"sdfs","g":"sdf"},... },
{"d":{"e":"sdfsdf","f":"sdfs","g":"sdf"},... }]) ...

attempt1 = FOREACH data GENERATE JsonTupleMap(complex_data#'c'); -- THIS LINE CAUSE AN ERROR
attempt2 = FOREACH data GENERATE JsonTupleMap(CONCAT(CONCAT('{\\"key\\":', complex_data#'c'), '}'); -- IT ALSO DOSE NOT WORK

我猜到“attempt1”失败了,因为该值不包含完整的JSON。但是,当我像“attempt2”一样使用CONCAT时,会生成附加的\标记。 (因此,每行都以 {\“key \”:开头)我不确定此附加标记是否违反了解析规则。无论如何,我都想解析给定的JSON字符串,以便Pig可以理解。如果您有任何方法或解决方案,请随时告诉我。

最佳答案

我终于通过将jyson库与jython UDF一起使用解决了我的问题。
我知道我可以使用JAVA或其他语言来解决。
但是,我认为jython和jyson是这个问题最简单的答案。

关于json - 解析Hadoop中包含的复杂Json字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33949349/

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