我是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更强大,但对我来说这只是为了理解事情)
-
如果有可能缺少什么?我似乎无法工作
非常感谢
干杯
法比恩
4 回答
正如在其他答案中提到的,你不能使用
SQLContext
来访问Hive表,他们在Spark 1.x.x中给出了一个单独的HiveContext
,它基本上是SQLContext
的扩展 .Reason::
Hive使用外部Metastore来保留所有元数据,例如有关db和tables的信息 . 这个Metastore可以配置为保存在MySQL等中 . 默认为derby . 这样做是为了访问Hive的所有用户都可以看到由Metastore促成的所有内容 . Derby在执行spark应用程序的目录中创建一个私有Metastore作为目录
metastore_db
. 由于此Metastore是私有的,因此您在此会话中创建或编辑的内容将无法被其他任何人访问 . SQLContext基本上有助于连接到私有Metastore .毋庸置疑,在Spark 2.x.x中,他们将两者合并为
SparkSession
,它充当了火花的单一切入点 . 您可以通过.enableHiveSupport()
创建SparkSession时启用Hive支持您无法使用标准
SQLContext
直接访问Hive . 要使用Hive,您需要使用Hive支持和HiveContext
构建的Spark二进制文件 .您可以使用JDBC数据源,但对于大规模处理而言,这是不可接受的性能 .
要访问SQLContext表,您需要临时注册它 . 然后,您可以轻松地对其进行SQL查询 . 假设您有一些JSON形式的数据 . 您可以在数据框中创建它 .
如下所示:
您还可以按如下方式收集行类型数组中的SQL数据: -
尝试不将sc保留到sqlContext中,我认为当我们使用sc spark创建sqlContext对象时试图调用HiveContext但是我们正在使用sqlContext
>>>df=sqlContext.sql("select * from <db-name>.<table-name>")
使用SQL上下文的超集,即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")