Hive支持通过内表或外表两种方式访问E-MapReduce(简称EMR)中的Phoenix数据。本文通过示例为您介绍如何使用EMR上的Hive处理EMR Phoenix数据。

前提条件

已创建Hadoop集群,并且选择了HBase、Zookeeper和Phoenix服务,详情请参见创建集群
说明 因为当前EMR-4.x和EMR-5.x系列版本未支持Phoenix服务,所以此文档仅适用于EMR-3.x系列版本。

Hive通过内表访问Phoenix

如果Phoenix中没有已经创建好的表,则可以在Hive中创建表,存储到Phoenix中。本示例是在Hive中新建表访问Phoenix。

  1. 进入Hive命令行。
    1. 使用SSH方式登录到集群主节点,详情请参见登录集群
    2. 执行以下命令,进入Hive命令行。
      hive
      返回信息如下所示时,表示进入Hive命令行。
      Logging initialized using configuration in file:/etc/ecm/hive-conf-2.3.5-2.0.3/hive-log4j2.properties Async: true
      Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
  2. 在Hive中创建并查询表数据。
    1. 执行以下命令,在Hive中创建Phoenix表。
      create table phoenix_hive_create_internal(s1 string,i1 int,f1 float,d1 double)
      stored by 'org.apache.phoenix.hive.PhoenixStorageHandler'
      tblproperties(
      "phoenix.table.name" = "phoenix_hive_create_internal",
      "phoenix.rowkeys" = "s1,i1",
      "phoenix.column.mapping" = "s1:s1,i1:i1,f1:f1,d1:d1",
      "phoenix.table.options" = "SALT_BUCKETS=10,DATA_BLOCK_ENCODING='DIFF'"
      );
      说明 表的存储方式是PhoenixStorageHandler,可以存储和读取Phoenix数据。
    2. 执行以下命令,向表中插入数据。
      insert into phoenix_hive_create_internal values('wyk',1,2.3412,3.14);
    3. 执行以下命令,查看表数据。
      select * from phoenix_hive_create_internal;
      返回信息如下。
      OK
      wyk     1       2.3412  3.14
      Time taken: 0.569 seconds, Fetched: 1 row(s)
  3. 进入Phoenix命令行。
    1. 使用SSH方式登录到集群主节点,详情请参见登录集群
    2. 执行以下命令,进入phoenix-current目录。
      cd /usr/lib/phoenix-current/
    3. 执行以下命令,进入Phoenix命令行。
      python ./bin/sqlline.py 
  4. 执行以下命令,在Phoenix中查看Hive写的数据是否已存在。
    select * from phoenix_hive_create_internal;
    返回信息如下。
    +------+-----+---------+-------+
    |  s1  | i1  |   f1    |  d1   |
    +------+-----+---------+-------+
    | wyk  | 1   | 2.3412  | 3.14  |
    +------+-----+---------+-------+
    说明 查看数据已存在,并且与在Hive中插入的数据一致,说明Hive已经成功访问了Phoenix的数据。

Hive通过外表访问Phoenix

如果已经在Phoenix中创建了表phoenix_hive_create_internal,想通过Hive访问,则可以使用Hive外表的方式与Phoenix中的表建立映射关系,进而通过Hive访问Phoenix中已经存在的表。

  1. 进入Hive命令行。
    1. 使用SSH方式登录到集群主节点,详情请参见登录集群
    2. 执行以下命令,进入Hive命令行。
      hive
      返回信息如下所示时,表示进入Hive命令行。
      Logging initialized using configuration in file:/etc/ecm/hive-conf-2.3.5-2.0.3/hive-log4j2.properties Async: true
      Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
  2. 执行以下命令,在Hive中创建外表,建立与Phoenix表的映射关系。
    create external table ext_table(
      s1 string,
      i1 int,
      f1 float,
      d1 double
    )
    stored by 'org.apache.phoenix.hive.PhoenixStorageHandler'
    tblproperties(
      "phoenix.table.name" = "phoenix_hive_create_internal",
      "phoenix.rowkeys" = "s1, i1",
      "phoenix.column.mapping" = "s1:s1, i1:i1, f1:f1, d1:d1"
    );
  3. 执行以下命令,在Hive中查看Phoenix表的数据。
    select * from ext_table;

    如果可以正常查询数据,说明Hive已经成功访问了Phoenix的数据。

相关文档