在Pig中解析复杂的嵌套JSON

在Pig中解析复杂的嵌套JSON,json,hadoop,apache-pig,elephantbird,Json,Hadoop,Apache Pig,Elephantbird,我想将亿万富翁JSON数据集解析为Pig。可以找到JSON文件 以下是每个条目的内容: { "wealth": { "worth in billions": 1.2, "how": { "category": "Resource Related", "from emerging": true, "industry": "Mining and metals",

我想将亿万富翁JSON数据集解析为Pig。可以找到JSON文件

以下是每个条目的内容:

{
    "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中使用以下命令加载此数据:

亿万富翁=使用JsonLoader('财富: (价值数十亿美元:两倍,如何:(类别:chararray,来自 新兴:查拉雷,工业:查拉雷,是政治:查拉雷, 继承人:chararray,创始人:chararray),类型:chararray),公司: (部门:chararray,成立时间:int,类型:chararray,名称:chararray,关系:chararray),等级:int,地点:(gdp:双,地区:chararray,国籍:chararray,国家 代码:chararray),年份:int,人口统计:(性别:chararray,年龄:int), 名称:chararray);

然而,这给了我一个错误:

错误org.apache.pig.tools.grunt.grunt-错误1200:输入“in”不匹配,应为右参数

尝试2

接下来,我尝试使用Twitter的elephantbird项目的加载程序
com.Twitter.elephantbird.pig.load.JsonLoader
。是此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字节): "hdfs://localhost:9000/user/purak/billionaires.json"

输出:已成功将0条记录存储在: "hdfs://localhost:9000/tmp/temp-1399280624/tmp-477607570“

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

Job DAG:Job_1478889184960_0005


我做错了什么?

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

  • 从字段名中删除空格:在json数据集中,我将“价值数十亿”、“来自新兴”等字段替换为“价值数十亿”、“来自新兴”等。(我为此做了一个简单的“查找并替换”)

  • 逗号分隔的json到换行符分隔的json:我的json文件的格式是
    [{{u comment:“first entry”…},{u comment:“second entry”…}
    。但Pig中的JsonLoader将每一行换行作为一个新条目。为了使json文件以换行符分隔,而不是使用命令行json处理器的逗号。使用
    sudo apt get Install js
    安装它,然后运行
    cat亿万富翁.json | jq-c.[]>newBillionaires.json

  • 现在,newBillionaires.json文件的每一项都位于新行。现在使用以下方法将此文件加载到Pig中:

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

  • 亿万富翁=使用 JsonLoader('名称:chararray,人口统计: (年龄:int,性别:chararray),年份:int,地点:(国家代码:chararray,国籍:chararray,地区:chararray,gdp:double),职级:int,公司: (关系:chararray,名称:chararray,类型:chararray,成立时间:int,扇区:chararray), 财富:(类型:chararray,方式:(创始人:chararray,继承人:chararray,政治:chararray,行业:chararray, 从(新兴:chararray,类别:chararray),价值(双倍)

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

  • 现在,您可以使用以下方法取消对每个元组的测试:
  • 亿万富翁最终=每位亿万富翁生成姓名, 人口统计。年龄与年龄,人口统计。性别与性别,年份, location.country_代码为countryCode,location.citifications为 公民身份,地点。地区作为地区,地点。gdp作为gdp,排名, company.relationship as company.relationship,company.name as companyName,company.type为companyType,company 公司成立,公司。部门为公司部门,财富。类型为 wealthType,wealth.how.was作为wasFounder,wealth.how 作为继承人,财富是如何政治化的, 财富。如何。行业作为行业,财富。如何。从 从新兴、财富、方式、类别到类别, 财富,价值百万,等于价值百万

  • 使用
    description.airesfinal检查结构一次
  • 亿万富翁决赛:{姓名:chararray,年龄:int,性别:chararray,年份: 国际,国家代码:chararray,国籍:chararray,地区: 性格,国内生产总值:双,排名:整数,同伴关系: chararray,公司名称:chararray,公司类型: chararray,companyFounded:int,companySector:chararray,wealthType: 查拉雷,华盛顿州创始人:查拉雷,继承:查拉雷,华盛顿州政治: chararray,行业:chararray,来自新兴市场:chararray,类别: 查拉雷,价值十亿:双倍}


    这就是我在Pig中想要的数据结构!现在我可以继续分析数据集了:)

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

  • 从字段名中删除空格:在json数据集中,我将“价值数十亿”、“来自新兴”等字段替换为“价值数十亿”、“来自新兴”等。(我为此做了一个简单的“查找并替换”)

  • 逗号分隔的json到换行符分隔的json:我的json文件的格式是
    [{{u comment:“first entry”…},{u comment:“second entry”…}
    。但Pig中的JsonLoader将每一行换行作为一个新条目。为了使json文件以换行符分隔,而不是使用命令行json处理器的逗号。使用
    sudo apt get Install js
    安装它,然后运行
    cat亿万富翁.json | jq-c.[]>newBillionaires.json

  • 现在,newBillionaires.json文件的每一项都位于新行。现在使用以下方法将此文件加载到Pig中:

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

  • 亿万富翁=使用 JsonLoader('n