我是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'),
我的问题是:
非常感谢
干杯
法比安
答案 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
答案 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")