访问 Hive 中已经存在的表

Posted

技术标签:

【中文标题】访问 Hive 中已经存在的表【英文标题】:Accessing already present table in Hive 【发布时间】:2019-08-11 07:54:48 【问题描述】:

我在 hive 中创建了 book_crossing_dataset 数据库,并在其中创建了 3 个表。

1) bx_books 2) bx_books_ratings 3) bx_user

如下图

create database book_crossing_dataset;
use book_crossing_dataset;
add jar /home/cloudera/Downloads/ccsv-serde-0.9.1.jar;

create external table stage_bx_user(
  User_ID int,
  Location string,
  Age int
)
row format serde 'com.bizo.hive.serde.csv.CSVSerde'
with serdeproperties(
"separatorChar" = "\;",
"quoteChar" = "\"")
stored as textfile
tblproperties ("skip.header.line.count"="1");

load data local inpath "/home/cloudera/workspace/BX-CSV-Dump/BX-Users.csv" into table stage_bx_user;

create external table bx_user(
 User_ID int,
 Location string,
 Age int
)
stored as parquet;

 insert into table bx_user select * from stage_bx_user;

现在我想从 spark 查询这个表,但是当我使用下面的代码时

from pyspark import SparkConf
from pyspark import SparkContext
from pyspark.sql import HiveContext


conf = SparkConf().setAppName("Book Crossing")

sc = SparkContext(conf=conf)

hc = HiveContext(sc)

books = hc.sql("show databases")

print(books.show())

那里只显示默认数据库。

我使用下面的链接作为参考 Query HIVE table in pyspark

【问题讨论】:

您提到您需要创建book_crossing_dataset 数据库,但我在您的代码中的任何地方都看不到这个数据库,除了您的问题描述。如果它不存在,您为什么希望在 show databases 查询中看到它? @RichardNemeth 也在代码中添加了该行。我通过 hive shell 运行数据库和表创建命令。 【参考方案1】:

您有一个创建数据库的调用,但您从未在创建表调用中使用它。我建议您将脚本的前 3 行更改为

create database if not exists book_crossing_dataset;
use book_crossing_dataset;
add jar /home/cloudera/Downloads/ccsv-serde-0.9.1.jar;

如果这没有帮助,那么问题在于 Spark 配置。我建议在启用 Hive 支持的情况下通过 SparkSession 尝试:

import pyspark

spark = pyspark.sql.SparkSession.builder. \
        appName("Book Crossing").enableHiveSupport().getOrCreate()

spark.sql("show databases").show()

【讨论】:

我也试过了,结果还是一样。如何解决 Spark 配置问题? 尝试将配置单元元存储配置添加到构建器builder.config("hive.metastore.uris", "YOUR_METASTORE_URL")

以上是关于访问 Hive 中已经存在的表的主要内容,如果未能解决你的问题,请参考以下文章

hive中的表操作

Hive基本操作

HIVE的基本操作

如何使用持久性访问模式中存在的表

使用 sqoop 将表从 RDBMS 导入 HIVE 后约束是不是仍然存在?

当数据库中的表已经存在时,留下不同的消息