我是hadoop生态系统的新手,但我仍然对一些事情感到困惑。我使用的是spark 1.6.0(hive 1.1.0-cdh5.8.0,hadoop 2.6.0-cdh5.8.0)
我有一些存在的配置单元表,我可以使用带有配置单元(map reduce)和impala(mpp)的hue web界面进行一些sql查询。
我现在正在使用pyspark(我认为这背后是pyspark shell),我想了解并测试hivecontext和sqlcontext。有许多细枝末节,讨论了两者之间的差异和各种版本的Spark。
在配置单元上下文中,我可以查询配置单元表:
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访问配置单元表进行简单的查询吗(我知道hivecontext更强大,但对我来说这只是为了理解一些事情)
如果这是可能的,还缺什么?除了hive-site.xml之外,我找不到任何信息,我尝试了这个文件,但似乎不起作用
谢谢
干杯
法比安
4条答案
按热度按时间fnvucqvd1#
不能使用标准
SQLContext
直接访问配置单元。要使用配置单元,您需要使用配置单元支持和HiveContext
.您可以使用jdbc数据源,但对于大规模处理来说,它在性能方面是不可接受的。
cwtwac6a2#
要访问sqlcontext表,需要临时注册它。然后您可以轻松地对其进行sql查询。假设您有一些json格式的数据。你可以在dataframe中创建它。
如下所示:
您还可以按以下方式收集行类型数组中的sql数据:below:-
um6iljoc3#
如其他答案所述,您不能使用
SQLContext
为了访问配置单元表,他们提供了一个单独的HiveContext
在spark 1.x.x中,它基本上是SQLContext
.原因:
hive使用外部元存储来保存所有元数据,例如关于db和表的信息。这个元存储可以配置为保存在mysql等中。默认值是derby。这样,所有访问配置单元的用户都可以看到metastore提供的所有内容。derby创建一个私有元存储作为目录
metastore_db
在执行spark应用程序的目录中。由于此元存储是私有的,因此任何其他人都无法访问在此会话中创建或编辑的内容。sqlcontext基本上促进了到私有元存储的连接。不用说,在spark2.x.x中,他们已经将两者合并到了一起
SparkSession
作为一个单一的切入点Spark。您可以在创建sparksession时启用配置单元支持,方法是.enableHiveSupport()
kg7wmglp4#
尝试不将sc保留在sqlcontext中,我认为当我们用sc创建sqlcontext对象时,spark试图调用hivecontext,但是我们使用的是sqlcontext
>>>df=sqlContext.sql("select * from <db-name>.<table-name>")
使用sql上下文的超集hivecontext连接并加载配置单元表以触发Dataframe>>>df=HiveContext(sc).sql("select * from <db-name>.<table-name>")
(或)>>>df=HiveContext(sc).table("default.text_Table")
(或)