Thrift :: TException = HASH(0x25d18e0)错误

时间:2017-09-19 13:46:38

标签: perl hadoop hive

我试图通过Perl模块Thrift :: API :: HiveClient连接到Hive,下面是连接到Hadoop配置单元并检索数据的代码

#!/usr/bin/perl

use DBI;
use DBI::DBD;
use Data::Dumper;
use List::MoreUtils qw(uniq);
use DateTime;
#use warnings 'all';
use POSIX qw(strftime);
use LWP::Simple;
use Thrift;
use Thrift::API::HiveClient;
use Data::Dumper;

my $latest_return;

# Database connection
my $client = Thrift::API::HiveClient->new(
     host    => 'localhost',
    port    => '10000',
);
$client->connect or die "Could not connect";

my $rh = $client->execute('select * from devtest.users');
my $return = [];
while ($latest_return = $client->fetch($rh)) { # will die with an error if it fails
    print $latest_return;
}

当我执行上面的脚本时,它会抛出以下消息

Thrift :: TException = HASH(0x25d18e0)

我还尝试过Dumper打印结果,没有打印出来。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

好的,所以这里的问题是 - 你正在做一些失败的事情。 您导入的模块 - Thrift::API::Hiveclient警告:

  

这个代码是高质量的,实验性的,可怕的易燃性

说完了 - 这里发生了什么,对某些人而言,行动失败了,而且die带有错误对象。

该错误对象具有状态代码和消息。 (我不认为这是idomatic perl,它更像是Java :))。

因此,connect出现错误,导致处理不当,导致代码死亡。

Thrift::TException是一种相当简单的对象:

package Thrift::TException;

sub new {
    my $classname = shift;
    my $self = {message => shift, code => shift || 0};

    return bless($self,$classname);
}
1;

字面上只是一条消息和一段代码。

要了解该消息,您需要取消引用您的对象,而这似乎不会发生什么。

我最好的猜测是Thrift::Socket中的_open方法返回错误,而HiveClient实际上并未捕获/处理它。

执行eval并捕获错误,然后解压缩TException。

在某处:

sub connect {
  my ($self) = @_;
  $self->_transport->open;
}

也许。我不是百分百肯定,因为Moo可能会对die做一些可爱的事情,但我无法找到或看到它在哪里。

如此简短的回答 - 您可能无法连接,确保您需要抓住该错误消息 - 要做到这一点,您需要将Hiveclient破解为评估操作。这是您通过使用“Alpha质量"”模块注册的内容。