thrift::texception=hash(0x25d18e0)错误

ljsrvy3e  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(304)

我试图通过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打印结果,结果什么也没打印出来。
非常感谢您的帮助。

r6l8ljro

r6l8ljro1#

好吧,现在的问题是-你做的事情失败了。您导入的模块- 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;

字面上只是一条信息和一个代码。
要获得该消息,需要取消对对象的引用,而这似乎并没有发生。
我最好的猜测是 _open 中的方法 Thrift::Socket 正在返回错误,而hiveclient实际上没有捕获/处理它。
它应该做一个 eval 捕获错误,然后解包texception。
在这里的某个地方:

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

也许 吧。我不是100%肯定,因为 Moo 可能会做些可爱的事 die ,但我找不到也看不到那在哪里。
所以简短的回答-你可能无法连接,以确保你需要抓住错误信息-要做到这一点,你需要黑客的 Hiveclient 评估手术。这就是你通过使用“alpha质量”模块注册的内容。

相关问题