pyspark,如何使用sqlcontext读取配置单元表?

mznpcxlj  于 2021-06-26  发布在  Hive
关注(0)|答案(4)|浏览(413)

我是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之外,我找不到任何信息,我尝试了这个文件,但似乎不起作用
谢谢
干杯
法比安

fnvucqvd

fnvucqvd1#

不能使用标准 SQLContext 直接访问配置单元。要使用配置单元,您需要使用配置单元支持和 HiveContext .
您可以使用jdbc数据源,但对于大规模处理来说,它在性能方面是不可接受的。

cwtwac6a

cwtwac6a2#

要访问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数据:below:-

r = FromSSQL.collect()
print r.column_Name
um6iljoc

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()

kg7wmglp

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") (或)

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

相关问题