检查表是不是存在并将数据加载到 Hbase 和 HIve 表中

Posted

技术标签:

【中文标题】检查表是不是存在并将数据加载到 Hbase 和 HIve 表中【英文标题】:Checking the table existence and loading the data into Hbase and HIve table检查表是否存在并将数据加载到 Hbase 和 HIve 表中 【发布时间】:2014-05-21 04:25:41 【问题描述】:

我在 HDFS 中有数据。我想将该数据加载到 hbase 和 hive 表中。 我已经编写了一个 bash shell 脚本,其中我编写了一个 pig 脚本来将数据从 HDFS 加载到 HBASE,还编写了 hive 脚本来将数据从 HDFS 加载到 HIVE 表,这些脚本工作得很好。这里我的 HDFS 数据文件是相同的结构,我将所有数据文件加载到单个 hbase 和 hive 表中。

现在我的查询是假设如果我在 HDFS 目录中收到更多数据文件,并且如果我再次运行 shell 脚本,它将再次创建具有相同名称的 hbase 和 hive 表并告诉表已经存在。如何编写 hive 和 hbase 查询,以便第一次检查表是否存在,如果表不存在,它会第一次创建表并将数据从 HDFS 加载到 HBASE 和 Hive 表。如果表已经存在,那么它只会将数据插入到现有的 hbase 和 hive 表中。它不应该覆盖表中已经存在的数据。 如何做到这一点?

下面是我的脚本文件:myScript.sh

echo "create 'goodtable','gt'" | hbase shell    
pig -f a.pig -param input=/user/user/d/
hive -f h.hql

在哪里 a.pig :

G = LOAD '$input' USING PigStorage(',') as (c1:chararray, c2:chararray,c3:chararray,c4:chararray,c5:chararray);
STORE G INTO 'hbase://goodtable' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage('gt:name gt:state gt:phone_no gt:gender');

h.hql:

create external table hive_table(
id int,
name string,
state string,
phone_no int,
gender string) row format delimited fields terminated by ',' stored as textfile;
LOAD DATA INPATH '/user/user/d/' INTO TABLE hive_table;

【问题讨论】:

【参考方案1】:

我只是想为 HBase 添加一个示例,因为之前已经介绍过 Hive:

if [[ $(echo "exists 'goodtable'" | hbase shell | grep 'not exist') ]]; 
then 
    echo "create 'goodtable','gt'" | hbase shell;   
fi

【讨论】:

【参考方案2】:

对于HIVE,您可以在CREATE TABLE 语句中添加命令IF NOT EXISTS。见documentation

我对@9​​87654326@没有太多经验,但我相信您可以使用EXISTS table_name命令检查表是否存在,然后create表不存在。见here

【讨论】:

我尝试使用 IF NOT EXISTS 为 HIVE 工作正常。但是现在我遇到了 HBASE 的问题。我仍然坚持检查 hbase 表是否存在。当我在脚本文件中编写以下行时,首先它会检查表是否存在,然后它会再次创建表 -->> echo "exists 'goodtable1'" | hbase shell echo "create 'goodtable1','gt'" | hbase shell【参考方案3】:

@visakh 是正确的 - 您可以通过输入 HBase shell 来查看 HBase 中是否存在表,然后键入:exists '<tablename>

为了在不交互式地进入 HBase shell 的情况下执行此操作,您可以创建一个简单的 ruby​​ 脚本,如下所示:

   exists 'mytable'
   exit

假设您将其保存到名为 tabletest.rb 的文件中。然后您可以通过调用hbase shell tabletest.rb 来执行此脚本。这将创建以下输出,然后您可以从您的 shell 脚本中对其进行解析:

    Table tableisthere does exist                                                           
    0 row(s) in 0.9830 seconds

    Table tableisNOTthere does not exist                                                           
    0 row(s) in 0.9830 seconds

为“多合一”脚本添加更多详细信息:

或者,您可以在 ruby​​ 中创建一个更高级的脚本来检查表是否存在,然后在需要时创建它 - 这是在 ruby​​ 脚本中调用 HBaseAdmin java api 完成的。

conf = HBaseConfiguration.new
hbaseAdmin = HBaseAdmin.new(conf)

if !hbaseAdmin.tableExists('mytable')
    hbaseAdmin.createTable('mytable',...)
end

【讨论】:

嗨,检查表是否存在工作正常。但是一旦我们检查表是否存在,那么如果它不存在我们必须创建一个表,否则需要将数据附加到没有给出错误的现有表。我如何在一个 shell 脚本中编写所有这些步骤?它没有将输出EXISTS table_name 带到create table 语句中。如何做到这一点? 刚刚在 ruby​​ 的一个脚本中添加了额外的位,如果有帮助的话。 你能告诉我如何通过 unix shell 脚本来完成。我不想使用 java api 或 ruby​​ 代码。那么如何使用 unix bash 脚本来完成呢?

以上是关于检查表是不是存在并将数据加载到 Hbase 和 HIve 表中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 shell 脚本加载 Hbase 表

仅当值不同时才更新 HBase 表

将 Hbase 表加载到 Spark -

检查数据库中是不是存在表 - PL SQL

尝试使用 Databricks 和 SQL 创建表并将数据加载到同一个表中

不存在多于一列