在Pig中解析复杂的嵌套JSON

时间:2016-11-12 19:47:01

标签: json hadoop apache-pig elephantbird

我想将Billionaires JSON数据集解析为Pig。可以找到JSON文件here

以下是每个条目的内容:

{
    "wealth": {
        "worth in billions": 1.2,
        "how": {
             "category": "Resource Related",
             "from emerging": true,
             "industry": "Mining and metals",
             "was political": false,
             "inherited": true,
             "was founder": true
         },
         "type": "privatized and resources"
    },
    "company": {
        "sector": "aluminum",
        "founded": 1993,
        "type": "privatization",
        "name": "Guangdong Dongyangguang Aluminum",
        "relationship": "owner"
        },
    "rank": 1372,
    "location": {
          "gdp": 0.0,
          "region": "East Asia",
          "citizenship": "China",
          "country code": "CHN"
              },
    "year": 2014,
    "demographics": {
              "gender": "male",
              "age": 50
              },
    "name": "Zhang Zhongneng"
}

尝试1

我尝试使用grunt中的以下命令加载此数据:

  <亿万富翁=负荷&#39;亿万富翁。杰森&#39;使用JsonLoader(&#39;财富:   (价值数十亿:双倍,如何:(类别:chararray,来自   新兴:chararray,行业:chararray,政治:chararray,   继承:chararray,创始人:chararray),类型:chararray),公司:   (部门:chararray,成立:INT,类型:chararray,名称:chararray,关系:chararray),等级:INT,地点:(国内生产总值:双,地区:chararray,国籍:chararray,国家   代码:chararray),年份:int,demographics :(性别:chararray,年龄:int),   名:chararray&#39);

然而,这给了我错误:

  

错误org.apache.pig.tools.grunt.Grunt - 错误1200:错误输入&#39; in&#39;期待RIGHT_PAREN

尝试2

接下来,我尝试使用Twitter的大象项目的加载程序com.twitter.elephantbird.pig.load.JsonLoaderHere是此UDF的代码。这就是我所做的:

billionaires = LOAD 'billionaires.json' USING com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad') AS (json:map[]);
names = foreach billionaires generate json#'name' AS name;
dump names;

现在运行,我没有错误!但是什么都没有显示我得到一个输出:

  

输入:从以下位置成功读取0条记录(1445335字节):   &#34; HDFS://本地主机:9000 /用户/ purak / billionaires.json&#34;

     

输出:成功将0条记录存储在:   &#34; HDFS://本地主机:9000 / TMP / TEMP-1399280624 / TMP-477607570&#34;

     

计数器:写入的总记录数:0写入的总字节数:0可溢出   内存管理器泄漏计数:0主动溢出的行李总数:0总计   主动泄漏的记录:0

     

Job DAG:job_1478889184960_0005

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

这可能不是最好的方法,但这就是我最终要做的事情:

  1. 从字段名称中删除空格:我在json数据集中用“worth_in_billions”,“from_emerging”等替换了“值数十亿”,“来自新兴”等字段。 (我为此做了一个简单的'查找和替换')

  2. 逗号分隔json到换行符分隔的json :我所拥有的json文件格式为[{"_comment":"first entry" ...},{"_comment":"second entry" ...}]。但是Pig中的JsonLoader将每个换行作为一个新条目。为了使json文件换行符而不是逗号,我使用了js这是一个命令行JSON处理器。使用sudo apt-get install js安装它并运行cat billionaires.json | jq -c ".[]" > newBillionaires.json

  3. newBillionaires.json文件现在每个条目都在新行上。现在使用以下命令将此文件加载到Pig中

    copyFromLocal /home/purak/Desktop/newBillionaires.json /user/purak

  4.   <亿万富翁=加载'newBillionaires.json'使用   JsonLoader('name:chararray,demographics:   (年龄:INT,性别:chararray),年:INT,地点:(COUNTRY_CODE:chararray,国籍:chararray,地区:chararray,国内生产总值:双),等级:INT,公司:   (关系:chararray,名称:chararray,类型:chararray,成立:INT,部门:chararray)   财富:(类型:chararray,方法如下:(was_founder:chararray,继承:chararray,was_political:chararray,行业:chararray,   from_emerging:chararray,类别:chararray),worth_in_biilions:双)');

    注意:使用js颠倒了每个条目中字段的顺序。因此,在加载命令中,与问题中的加载命令相比,所有字段的顺序都相反。

    1. 您现在可以使用以下方法取消每个元组:
    2.   <亿万富翁最终=亿万富翁生成名字,   demographics.age作为年龄,demographics.gender作为性别,年,   location.country_code为countryCode,location.citizenship as   公民身份,location.region为地区,location.gdp为gdp,rank,   company.relationship as companyRelationship,company.name as   companyName,company.type as companyType,company.founded as   companyFounded,company.sector as companySector,wealth.type as   财富类型,财富。发明创始人,财富.how.inherited   作为继承者,财富如何政治,政治,政治,   财富。工业,财富。财富   fromEmerging,wealth.how.category作为类别,   wealth.worth_in_biilions as worthInBillions;

      1. 使用describe billionairesFinal;
      2. 检查一次结构
          

        亿万富翁最终:{姓名:chararray,年龄:int,性别:chararray,年份:   int,countryCode:chararray,citizenship:chararray,region:   chararray,gdp:double,rank:int,companyRelationship:   chararray,companyName:chararray,companyType:   chararray,companyFounded:int,companySector:chararray,wealthType:   chararray,wasfounder:chararray,继承:chararray,wasPolitical:   chararray,industry:chararray,fromEmerging:chararray,category:   chararray,worthInBillions:double}

        这是我想要猪的数据的预期结构!现在我可以提前分析数据集:)