pyspark,如何用SQLContext读取Hive表?

时间:2017-06-09 19:32:57

标签: apache-spark hive apache-spark-sql

我是Hadoop生态系统的新手,我仍然对一些事情感到困惑。我使用的是Spark 1.6.0(Hive 1.1.0-cdh5.8.0,Hadoop 2.6.0-cdh5.8.0)

我有一些Hive表存在,我可以使用HUE Web界面与Hive(map reduce)和Impala(mpp)进行一些SQL查询。

我现在正在使用pySpark(我认为这背后是pyspark-shell)我想了解并测试HiveContext和SQLContext。有许多人已经讨论了两者之间的差异以及各种版本的Spark。

使用Hive上下文,查询Hive表没有问题:

from pyspark.sql import HiveContext
mysqlContext = HiveContext(sc) 
FromHive = mysqlContext.sql("select * from table.mytable")
FromHive.count()
320

到目前为止一切顺利。由于SQLContext是HiveContext的子集,我认为基本的SQL选择应该起作用:

from pyspark.sql import SQLContext
sqlSparkContext = SQLContext(sc) 
FromSQL = mysqlContext.sql("select * from table.mytable")
FromSQL.count()

Py4JJavaError: An error occurred while calling o81.sql.
: org.apache.spark.sql.AnalysisException: Table not found: `table`.`mytable`;

我将hive-site.xml添加到pyspark-shell。运行时

sc._conf.getAll(

我明白了:

('spark.yarn.dist.files', '/etc/hive/conf/hive-site.xml'),

我的问题是:

  • 我可以使用SQLContext访问Hive表以进行简单查询(我知道 HiveContext更强大,但对我来说这只是理解 的东西)
  • 如果可能,那么缺少什么?我找不到任何信息 来自我尝试但似乎不起作用的hive-site.xml

非常感谢

干杯

法比安

4 个答案:

答案 0 :(得分:2)

正如在其他答案中所提到的,你不能使用SQLContext来访问Hive表,他们在Spark 1.xx中给出了一个单独的HiveContext,它基本上是{{1}的扩展名}。

原因::

Hive使用外部Metastore来保存所有元数据,例如有关db和tables的信息。这个Metastore可以配置为保存在MySQL等中。默认为derby。 这样做是为了访问Hive的所有用户都可以看到由Metastore促成的所有内容。 Derby在执行spark应用程序的目录中创建一个私有Metastore作为目录SQLContext。由于此Metastore是私有的,因此您在此会话中创建或编辑的内容将无法被其他任何人访问。 SQLContext基本上有助于连接到私有Metastore。

毋庸置疑,在Spark 2.x.x中,他们将两者合并为metastore_db,它充当了火花的单一入口点。您可以在SparkSession

创建SparkSession时启用Hive支持

答案 1 :(得分:1)

您无法使用标准SQLContext直接访问Hive。要使用Hive,您需要使用Hive支持和HiveContext构建Spark二进制文件。

您可以使用JDBC数据源,但对于大规模处理而言,它不会是可接受的性能。

答案 2 :(得分:0)

要访问SQLContext表,您需要临时注册它。然后,您可以轻松地对其进行SQL查询。假设您有一些JSON形式的数据。您可以在数据框中创建它。

如下所示:

from pyspark.sql import SQLContext
sqlSparkContext = SQLContext(sc)
df = sqlSparkContext.read.json("your json data")
sql_df = df.registerTempTable("mytable")
FromSQL = sqlSparkContext.sql("select * from mytable")
FromSQL.show()

您还可以按如下方式收集行类型数组中的SQL数据: -

r = FromSSQL.collect()
print r.column_Name

答案 3 :(得分:0)

尝试不将sc保留到sqlContext中,我认为当我们用sc spark创建sqlContext对象时试图调用HiveContext但是我们正在使用sqlContext

>>>df=sqlContext.sql("select * from <db-name>.<table-name>")

使用SQL Context的超集,即HiveContext连接并加载配置单元表以激发数据帧

>>>df=HiveContext(sc).sql("select * from <db-name>.<table-name>")

(或)

>>>df=HiveContext(sc).table("default.text_Table") (或)

>>> hc=HiveContext(sc)

>>> df=hc.sql("select * from default.text_Table")