解析pig中的复杂嵌套json

58wvjzkj  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(566)

我想将一个亿万富翁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('wealth:'worth in.)加载'billizenaires.json'billions:double,如何:(category:chararray,来自emerging:chararray, industry:chararray,是political:chararray, inherited:chararray,是founder:chararray), type:chararray),公司:(sector:chararray,founded:int,type:chararray,name:chararray,相对ationship:chararray),rank:int,位置:(gdp:double,region:chararray,ci公司tizenship:chararray,国家code:chararray), year:int,人口统计:(gender:chararray,age:int), name:chararray');
但这给了我一个错误:
error org.apache.pig.tools.grunt.grunt-错误1200:不匹配的输入'in'应为右\u paren
尝试2
接下来,我尝试使用twitter的elephantbird项目的loader com.twitter.elephantbird.pig.load.JsonLoader . 这是这个自定义项的代码。我就是这么做的:

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/亿万富翁.json“
输出:已成功将0条记录存储在:hdfs://localhost:9000/tmp/temp-1399280624/tmp-477607570“
计数器:写入的记录总数:写入的字节总数:0可溢出内存管理器溢出计数:0主动溢出的包总数:0主动溢出的记录总数:0
作业编号:作业编号:1478889184960
我做错什么了?

oyjwcjzk

oyjwcjzk1#

这可能不是最好的方法,但这就是我最终要做的:
删除字段名中的空格:在json数据集中,我用“worth\u in\u billions”、“from\u emerging”等替换了“worth\u in\u billions”、“from\u emerging”等字段(我为此做了一个简单的“查找和替换”。)
逗号分隔的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 .
现在newbillionaires.json文件的每一项都位于新行。现在使用以下方法将此文件加载到pig中: copyFromLocal /home/purak/Desktop/newBillionaires.json /user/purak 亿万富翁=使用jsonloader()加载“newbillionaires.json”name:chararray,人口统计:(age:int,gender:chararray),year:int,地点:(国家)_code:chararray,ci公司tizenship:chararray,region:chararray,gdp:double),rank:int,公司:(relationship:chararray,name:chararray,type:chararray,founded:int,sector:chararray),财富:(type:chararray,你是怎么做到的_founder:chararray,inherited:chararray,是_political:chararray,industry:chararray,来自_emerging:chararray,category:chararray),值得_biilions:double)');
注意:使用js颠倒了每个条目中字段的顺序。因此,在load命令中,所有字段的顺序与问题中的load命令相反。
现在可以使用以下方法取消每个元组的嵌套:
亿万富翁最终=为每位亿万富翁生成姓名、人口统计信息、年龄、人口统计信息、性别、年份、地点、国家代码、国籍、地区、地区、gdp、职级、公司关系、公司名称、公司类型,公司成立时为公司成立,公司部门为公司部门,财富类型为财富类型,财富类型为创始人,财富类型为继承,财富类型为政治,财富类型为产业,财富类型为新兴,财富类型为类别,财富,价值百万等于价值百万;
使用后检查结构 describe billionairesFinal; :
亿万富翁决赛:{姓名:chararray,年龄:int,性别:chararray,年份:int,国家代码:chararray,国籍:chararray,地区:chararray,gdp:double,排名:int,公司关系:chararray,公司名称:chararray,公司类型:chararray,公司成立地:int,公司部门:chararray,财富类型:chararray,was创始人:chararray,继承人:chararray,was political:chararray,industry:chararray,frommerging:chararray,category:chararray,worthinbillions:double}
这就是我在pig中想要的数据结构!现在我可以继续分析数据集:)

相关问题