`pyspark.sql.SparkSession.sql` 和 `SQLContext.read.format()` 有啥区别?
Posted
技术标签:
【中文标题】`pyspark.sql.SparkSession.sql` 和 `SQLContext.read.format()` 有啥区别?【英文标题】:What is difference between `pyspark.sql.SparkSession.sql` and `SQLContext.read.format()`?`pyspark.sql.SparkSession.sql` 和 `SQLContext.read.format()` 有什么区别? 【发布时间】:2018-04-06 05:55:39 【问题描述】:我想使用 spark 对数据库进行查询。现在我正在使用该方法
df = SQLContext.read.format('jdbc')
.option('url',database_url)
.option('dbtable',my_query)
.option('numpartitions',number_of_partitions)
.option(...)
它工作得很好。但是还有另一种方法可以在 pyspark 中触发查询,称为
df = pyspark.sql.SparkSession().sql(myquery)
两者都返回数据帧。
关于这个的问题很少:
1) 这两者到底有什么区别?
2) 如果是pyspark.sql.SparkSession().sql(myquery)
,如何设置数据库URL、分区数等所有参数?
【问题讨论】:
【参考方案1】:在 Spark 1.6 之前,Spark 有许多上下文,例如 sqlcontext
、hivecontext
等,用于处理不同类型的数据源。在 Spark2 中,Spark 应用程序的起点是SparkSession
,它包含所有上述上下文。
DataFrameReader
使用jdbc
API 提供支持。您可以执行以下操作来实现您想要的:
df = spark.read.jdbc(url, table, numPartitions=number_of_partitions)
即使这个也应该工作:
df = spark.read.format('jdbc').option('url',database_url)
.option('dbtable',my_query)
.option('numpartitions',number_of_partitions)
.option()......
上面sn-ps中提到的spark
只不过是SparkSession
。看看相关APIhere
【讨论】:
这很有帮助!谢谢 !还有一个问题是 SQLContext 支持 hive 吗?我正在使用火花 2.3.0 就像我说的,SparkContext
、SQLContext
、HiveContext
专注于 Spark 1.x。这些上下文存在于 Spark2 中纯粹是为了向后兼容。由于您使用的是 Spark2,因此只需使用已包含所有上下文的 SparkSession
。
以及关于如何使用SparkSession
访问Hive表的参考:通过调用spark = SparkSession.builder.enableHiveSupport.getOrCreate()
获取SparkSession然后使用spark.sql()
查询和访问Hive表以上是关于`pyspark.sql.SparkSession.sql` 和 `SQLContext.read.format()` 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章