如何读取 JSON 列作为 Apache PIG 中的字段
How to read a JSON column as a field in Apache PIG
我正在尝试使用 Apache Pig 读取从 Kaggle 获得的电影数据集。其中一个 .csv 文件名为 "keywords.csv",它具有如下元组:
862,[{'id': 931, 'name': 'jealousy'}, {'id': 4290, 'name': 'toy'}, {'id': 5202, 'name': 'boy'}, {'id': 6054, 'name': 'friendship'}, {'id': 9713, 'name': 'friends'}, {'id': 9823, 'name': 'rivalry'}, {'id': 165503, 'name': 'boy next door'}, {'id': 170722, 'name': 'new toy'}, {'id': 187065, 'name': 'toy comes to life'}]
8844,[{'id': 10090, 'name': 'board game'}, {'id': 10941, 'name': 'disappearance'}, {'id': 15101, 'name': "based on children's book"}, {'id': 33467, 'name': 'new home'}, {'id': 158086, 'name': 'recluse'}, {'id': 158091, 'name': 'giant insect'}]
.
.
.
第一个字段是电影的 ID,第二个字段是一个 JSON 类字符串,其中包含与该电影及其 ID 相关的关键字。数据集的所有 .csv 文件中的文件分隔符都是逗号,但是在加载 keywords.csv 时会出现问题。这是我尝试加载 table:
的方式
keywords = load 'dataset/keywords.csv' USING PigStorage(',') as (id:int, keywords:chararray);
fltr = filter keywords by id == 862;
DUMP fltr;
它只打印 (862,"[{'id': 931)
当我期待它打印这样的东西时:
(862,[{'id': 931, 'name': 'jealousy'}, {'id': 4290, 'name': 'toy'}, {'id': 5202, 'name': 'boy'}, {'id': 6054, 'name': 'friendship'}, {'id': 9713, 'name': 'friends'}, {'id': 9823, 'name': 'rivalry'}, {'id': 165503, 'name': 'boy next door'}, {'id': 170722, 'name': 'new toy'}, {'id': 187065, 'name': 'toy comes to life'}])
这样我就可以将列关键字保存在扩展名为 .json 的新文件中,然后使用 JsonLoader()
提取关键字。
我应该怎么做?或者甚至可以直接读取关键字而不必将其保存到外部 .json 文件?谢谢。
更新 1
刚刚在 Apache pig 中发现地图,这是我最近的尝试:
keywords = load 'dataset/keywords.csv' USING PigStorage(',') as (id:int, keywords:[{keyId:int,name:chararray}]);
抛出错误:Syntax error, unexpected symbol at or near 'int'
我认为你需要使用 Twitter 的 Elephant Bird to parse a single json column in Pig. (If you wanted to parse files that are json-only, you could simply use Pig's JsonLoader API)。
这里是 a related question - 看起来你的 json 也是一个数组,所以那里写的也适用于你。
如果这不起作用,这里是 a blog post describing how to write a Python UDF for a more specific case of JSON parsing。你当然可以用 Java UDF 做同样的事情。
我正在尝试使用 Apache Pig 读取从 Kaggle 获得的电影数据集。其中一个 .csv 文件名为 "keywords.csv",它具有如下元组:
862,[{'id': 931, 'name': 'jealousy'}, {'id': 4290, 'name': 'toy'}, {'id': 5202, 'name': 'boy'}, {'id': 6054, 'name': 'friendship'}, {'id': 9713, 'name': 'friends'}, {'id': 9823, 'name': 'rivalry'}, {'id': 165503, 'name': 'boy next door'}, {'id': 170722, 'name': 'new toy'}, {'id': 187065, 'name': 'toy comes to life'}]
8844,[{'id': 10090, 'name': 'board game'}, {'id': 10941, 'name': 'disappearance'}, {'id': 15101, 'name': "based on children's book"}, {'id': 33467, 'name': 'new home'}, {'id': 158086, 'name': 'recluse'}, {'id': 158091, 'name': 'giant insect'}]
.
.
.
第一个字段是电影的 ID,第二个字段是一个 JSON 类字符串,其中包含与该电影及其 ID 相关的关键字。数据集的所有 .csv 文件中的文件分隔符都是逗号,但是在加载 keywords.csv 时会出现问题。这是我尝试加载 table:
的方式keywords = load 'dataset/keywords.csv' USING PigStorage(',') as (id:int, keywords:chararray);
fltr = filter keywords by id == 862;
DUMP fltr;
它只打印 (862,"[{'id': 931)
当我期待它打印这样的东西时:
(862,[{'id': 931, 'name': 'jealousy'}, {'id': 4290, 'name': 'toy'}, {'id': 5202, 'name': 'boy'}, {'id': 6054, 'name': 'friendship'}, {'id': 9713, 'name': 'friends'}, {'id': 9823, 'name': 'rivalry'}, {'id': 165503, 'name': 'boy next door'}, {'id': 170722, 'name': 'new toy'}, {'id': 187065, 'name': 'toy comes to life'}])
这样我就可以将列关键字保存在扩展名为 .json 的新文件中,然后使用 JsonLoader()
提取关键字。
我应该怎么做?或者甚至可以直接读取关键字而不必将其保存到外部 .json 文件?谢谢。
更新 1
刚刚在 Apache pig 中发现地图,这是我最近的尝试:
keywords = load 'dataset/keywords.csv' USING PigStorage(',') as (id:int, keywords:[{keyId:int,name:chararray}]);
抛出错误:Syntax error, unexpected symbol at or near 'int'
我认为你需要使用 Twitter 的 Elephant Bird to parse a single json column in Pig. (If you wanted to parse files that are json-only, you could simply use Pig's JsonLoader API)。
这里是 a related question - 看起来你的 json 也是一个数组,所以那里写的也适用于你。
如果这不起作用,这里是 a blog post describing how to write a Python UDF for a more specific case of JSON parsing。你当然可以用 Java UDF 做同样的事情。