使用 pig 从 csv 文件中读取数据

Posted

技术标签:

【中文标题】使用 pig 从 csv 文件中读取数据【英文标题】:Reading data from csv file using pig 【发布时间】:2015-10-04 15:14:21 【问题描述】:

我正在尝试在 mac 上读取猪壳上的 csv 文件。我所做的只是将load 文件放入变量中,然后将dump 变量放入变量中。这是我的做法:

movies = LOAD '/user/myhome/movies_data.csv' USING PigStorage(',') as (id,name,year,rating,duration);
DUMP movies;

我使用的数据是从github下载的,提供here

此文件在我的 mac 上本地安装的 hdfs 中可用。当我执行dump 时出现错误:

org.apache.pig.impl.logicalLayer.FrontendException: ERROR 1066: Unable to open iterator for alias movies

在 org.apache.pig.PigServer.openIterator(PigServer.java:935) 在 org.apache.pig.tools.grunt.GruntParser.processDump(GruntParser.java:754) 在 org.apache.pig.tools.pigscript.parser.PigScriptParser.parse(PigScriptParser.java:376) 在 org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:230) 在 org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:205) 在 org.apache.pig.tools.grunt.Grunt.run(Grunt.java:66) 在 org.apache.pig.Main.run(Main.java:565) 在 org.apache.pig.Main.main(Main.java:177) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.apache.hadoop.util.RunJar.run(RunJar.java:221) 在 org.apache.hadoop.util.RunJar.main(RunJar.java:136) 原因: java.io.IOException:作业以异常状态 FAILED 终止 org.apache.pig.PigServer.openIterator(PigServer.java:927) ... 13 更多

当我在运行此作业时点击应用集群链接时,出现以下异常:

诊断:容器启动异常。 容器 ID:container_1443887668938_0007_02_000001 退出代码:127 堆栈跟踪:ExitCodeException exitCode=127:在 org.apache.hadoop.util.Shell.runCommand(Shell.java:538) 在 org.apache.hadoop.util.Shell.run(Shell.java:455) 在 org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:715) 在 org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:211) 在 org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:302) 在 org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:82) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745) 容器以 非零退出代码 127 此尝试失败。申请失败。

Pig 版本是 0.15.0,hadoop 是 2.6.1。我在这里错过了什么吗?

【问题讨论】:

相关帖子,查看***.com/questions/20350122/… 虽然没有帮助。就版本而言,我使用的是 pig 0.15.0 而 hadoop 是 2.6.1 @coder :我认为脚本没有任何问题。如果您在集群模式下运行 pig,您能否检查文件在 hdfs 中是否可用?您可以尝试将这个文件放在本地驱动器中并在本地模式下运行相同的示例(pig -x local)吗? 对于在寻找ERROR 1066: Unable to open iterator for alias 时发现此帖子的人,这里是generic solution。 【参考方案1】:

您可以使用 piggybank 中的 CSVLoader。如果不可用,请获取 piggybank jar 并注册它并使用 CSVLoader。像这样。

register '/your/path/to/piggybank/jar' ;
define CSVLoader org.apache.pig.piggybank.storage.CSVLoader();
movies = LOAD '/user/myhome/movies_data.csv' USING CSVLoader as (id,name,year,rating,duration);

【讨论】:

但是在这里使用 PigStorage() 不应该开箱即用吗?我不明白我在这里缺少什么。 我应该尝试使用您的数据集。数据集看起来也不错。但是由于您的错误,猪似乎无法解析数据。 是的,我不明白为什么。

以上是关于使用 pig 从 csv 文件中读取数据的主要内容,如果未能解决你的问题,请参考以下文章

csv 在 pig 中读取,csv 文件包含带引号的逗号

如何在 Pig 中读取 csv 文件中的下一行

如何读取 CSV 并生成 json/avro 文件,其中 pig 按第一列的值分组?

可以使用 PIG 读取的文件格式

从 csv 文件读取数据并使用 phpspreadsheet 写入 excel

使用 PIG 读取 XML