`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 有许多上下文,例如 sqlcontexthivecontext 等,用于处理不同类型的数据源。在 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 就像我说的,SparkContextSQLContextHiveContext 专注于 Spark 1.x。这些上下文存在于 Spark2 中纯粹是为了向后兼容。由于您使用的是 Spark2,因此只需使用已包含所有上下文的 SparkSession 以及关于如何使用SparkSession访问Hive表的参考:通过调用spark = SparkSession.builder.enableHiveSupport.getOrCreate()获取SparkSession然后使用spark.sql()查询和访问Hive表

以上是关于`pyspark.sql.SparkSession.sql` 和 `SQLContext.read.format()` 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

带有架构的 pyspark.sql SparkSession load() :架构中的非字符串类型字段使所有值都为空

如何使用其模式从 Pyspark 数据框创建配置单元表?

找不到数据源:Python环境中的delta