Apache spark pyspark,如何使用SQLContext读取配置单元表?

Apache spark pyspark,如何使用SQLContext读取配置单元表?,apache-spark,hive,apache-spark-sql,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) 我有一些存在的配置单元表,我可以使用带有配置单元(map reduce)和Impala(mpp)的色调web界面执行一些SQL查询 我现在正在使用pySpark(我认为这背后是pySpark shell),我想了解并测试HiveContext和SQLContext。对于Spark的不同版本,有许多thready讨论了两者

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

我有一些存在的配置单元表,我可以使用带有配置单元(map reduce)和Impala(mpp)的色调web界面执行一些SQL查询

我现在正在使用pySpark(我认为这背后是pySpark shell),我想了解并测试HiveContext和SQLContext。对于Spark的不同版本,有许多thready讨论了两者之间的差异

使用配置单元上下文,我查询配置单元表没有问题:

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,我尝试过但似乎不起作用
非常感谢

干杯


Fabien

您不能使用标准的
SQLContext
直接访问配置单元。要使用配置单元,您需要使用配置单元支持和
HiveContext
构建Spark二进制文件


您可以使用JDBC数据源,但对于大规模处理来说,它在性能方面是不可接受的。

您不能使用标准的
SQLContext
直接访问配置单元。要使用配置单元,您需要使用配置单元支持和
HiveContext
构建Spark二进制文件


您可以使用JDBC数据源,但对于大规模处理来说,它在性能方面是不可接受的。

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

如下图所示:

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

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

如下图所示:

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

正如在其他答案中提到的,您不能使用
SQLContext
访问配置单元表,它们在Spark 1.x.x中提供了一个单独的
HiveContext
,它基本上是
SQLContext
的扩展

原因::

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


不用说,在Spark 2.x.x中,他们将两者合并为
SparkSession
,作为Spark的单一入口点。您可以通过
在创建SparkSession时启用配置单元支持。enableHiveSupport()

如其他答案中所述,您不能使用
SQLContext
访问配置单元表,它们在Spark 1.x.x中提供了一个单独的
HiveContext
,它基本上是
SQLContext
的扩展

原因::

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


不用说,在Spark 2.x.x中,他们将两者合并为
SparkSession
,作为Spark的单一入口点。您可以通过
在创建SparkSession时启用配置单元支持。enableHiveSupport()

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

>df=sqlContext.sql(“选择*自”)

使用SQL上下文的超集(即HiveContext)连接并加载配置单元表以触发数据帧

df=HiveContext(sc.sql(“选择*自”)

(或)

df=HiveContext(sc.table(“default.text\u table”) (或)

>>hc=HiveContext(sc)


>>>df=hc.sql(“从默认值.text_表中选择*)

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

>df=sqlContext.sql(“选择*自”)

使用SQL上下文的超集(即HiveContext)连接并加载配置单元表以触发数据帧

df=HiveContext(sc.sql(“选择*自”)

(或)

df=HiveContext(sc.table(“default.text\u table”) (或)

>>hc=HiveContext(sc)


>>>df=hc.sql(“从默认的.text\u表中选择*)

HiveContext是Spark sql执行引擎的一个实例,而不是SQLContext的另一个实例,不是吗?我的意思是说这个hivecontext是sqlcontext的扩展。给出的答案是正确的。HiveContext就是一个例子