我试图通过perl模块thrift::api::hiveclient连接到hive,下面是连接到hadoop hive并检索数据的代码
# !/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;
}
当我执行上面的脚本时,它会抛出下面的消息
节俭::texception=hash(0x25d18e0)
我也试过dumper打印结果,结果什么也没打印出来。
非常感谢您的帮助。
1条答案
按热度按时间r6l8ljro1#
好吧,现在的问题是-你做的事情失败了。您导入的模块-
Thrift::API::Hiveclient
警告:此代码是阿尔法质量,实验性的,可能易燃
话虽如此,这里发生的事情,对某些人来说,行动是失败的,而且是失败的
die
与错误对象绑定。该错误对象具有状态代码和消息(我不认为这是idomatic perl,它更像java:))。
所以在
connect
有一个错误,它没有被正确处理,所以你的代码正在消亡。一
Thrift::TException
是一种相当简单的对象:字面上只是一条信息和一个代码。
要获得该消息,需要取消对对象的引用,而这似乎并没有发生。
我最好的猜测是
_open
中的方法Thrift::Socket
正在返回错误,而hiveclient实际上没有捕获/处理它。它应该做一个
eval
捕获错误,然后解包texception。在这里的某个地方:
也许 吧。我不是100%肯定,因为
Moo
可能会做些可爱的事die
,但我找不到也看不到那在哪里。所以简短的回答-你可能无法连接,以确保你需要抓住错误信息-要做到这一点,你需要黑客的
Hiveclient
评估手术。这就是你通过使用“alpha质量”模块注册的内容。