我试图通过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打印结果,没有打印出来。
非常感谢任何帮助。
答案 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质量"”模块注册的内容。