在 Pig 中使用 Hcat Loader 访问在 Hive 中创建的视图
Posted
技术标签:
【中文标题】在 Pig 中使用 Hcat Loader 访问在 Hive 中创建的视图【英文标题】:accesing Views created in Hive using HcatLoader in Pig 【发布时间】:2013-03-04 23:16:04 【问题描述】:我只是在猪的 hive 和 HcatLoader 中尝试一些东西。我所做的是,在 Hive 中创建了一个视图,然后尝试通过我使用 HcatLoader 创建的视图将数据加载到猪中。但它似乎不起作用。我只是想确认有没有办法做到这一点?当我尝试使用 HcatLoader 在猪中加载视图时出现以下错误
events=使用 org.apache.hcatalog.pig.HCatLoader() 加载“视图名称”; 转储事件;
当我使用任何 tableName 而不是 Hive 中的 View 时,它似乎可以工作。此外,它不会给出 Metastore 错误。正如它所说的在转储时在加载语句中成功连接到元存储,它崩溃并出现以下错误。
任何指针都会有所帮助。
谢谢, 阿图尔
org.apache.pig.impl.logicalLayer.FrontendException: ERROR 1066: Unable to open iterator for alias events
at org.apache.pig.PigServer.openIterator(PigServer.java:857)
at org.apache.pig.tools.grunt.GruntParser.processDump(GruntParser.java:682)
at org.apache.pig.tools.pigscript.parser.PigScriptParser.parse(PigScriptParser.java:303)
at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:189)
at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:165)
at org.apache.pig.tools.grunt.Grunt.exec(Grunt.java:84)
at org.apache.pig.Main.run(Main.java:555)
at org.apache.pig.Main.main(Main.java:111)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.util.RunJar.main(RunJar.java:156)
Caused by: org.apache.pig.PigException: ERROR 1002: Unable to store alias events
at org.apache.pig.PigServer.storeEx(PigServer.java:956)
at org.apache.pig.PigServer.store(PigServer.java:919)
at org.apache.pig.PigServer.openIterator(PigServer.java:832)
... 12 more
Caused by: org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobCreationException: ERROR 2017: Internal error creating job configuration.
at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler.getJob(JobControlCompiler.java:731)
at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler.compile(JobControlCompiler.java:259)
at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher.launchPig(MapReduceLauncher.java:180)
at org.apache.pig.PigServer.launchPlan(PigServer.java:1270)
at org.apache.pig.PigServer.executeCompiledLogicalPlan(PigServer.java:1255)
at org.apache.pig.PigServer.storeEx(PigServer.java:952)
【问题讨论】:
对于在寻找ERROR 1066: Unable to open iterator for alias 时发现此帖子的人,这里是generic solution。 【参考方案1】:我收到的回复是在其他论坛上发布的。
"HCatLoader 不支持在 Hive 中读取视图。问题是视图被定义为对表的查询 (create view V as select x, y from t)。
猪不会说 SQL,
和
HCat 不包含 Hive 的执行引擎
所以它也不能执行查询。从 Pig 和 MR 读取 Hive 视图将需要比我们目前更紧密的产品集成。”
【讨论】:
即使我遇到了同样的问题并最终得出结论,Pig 无法使用 HCatLoader 读取视图。【参考方案2】:我今天发现了同样的问题。 Hive 无法读取 Hive 视图(但缺少关于此主题的良好异常处理代码)。 对于记录(任何其他陷入此问题的人),这是当前版本的行为方式:在 Hortonworks 2.3 和 Pig 1.15 上,我在日志中只收到以下错误:
错误 org.apache.pig.tools.grunt.Grunt - 错误 2017:内部错误 创建作业配置。
Pig 以这种方式失败,因为没有要加载的文件(因为我们试图从视图加载)。
【讨论】:
【参考方案3】:由于 Pig 从 hadoop 中的文件加载数据,因此从视图(没有物理文件)读取数据可能无法正常工作。 可能如果我们能够设法在 hadoop 中为视图创建一个文件,Pig 可能能够加载它。至少一个指向实际数据文件的虚拟指针文件。 不确定这是否可行或已经考虑过。
【讨论】:
HCatLoader 不会从文件中提取数据,它使用 Hive。如果您想进一步清除它,可以尝试一件事。有时数据文件包含空值,这些值会自动转换为“\N”,您可以在 select 语句中看到。如果您使用 HCatLoader 在 pig 脚本中加载相同的数据,您将在 dump 语句中获得值 '\N'。以上是关于在 Pig 中使用 Hcat Loader 访问在 Hive 中创建的视图的主要内容,如果未能解决你的问题,请参考以下文章