在一次执行中使用几个sqlContext

时间:2018-02-06 13:52:42

标签: python apache-spark pyspark

我在下面写了代码:

import pyspark
def getHub(sc, ClientId):
    sqlContext = pyspark.sql.SQLContext(sc)
    return sqlContext.table("myTable").where("ClientId = "+ClientId)

sc = pyspark.SparkContext()
df = getHub(sc, 1).union(getHub(sc, 2))

我知道我无法创建多个SparkContext,但在创建多个SQLContext时是否存在任何问题?或者最好只创建1 SQLContext然后将其作为arg传递?

1 个答案:

答案 0 :(得分:1)

TL; DR 如果您想避免在使用SparkSession.builder.getOrCreate周围传递上下文。除非您想要实现名称空间(函数,临时视图)的隔离,否则没有理由维护多个会话。

表现明智

每个上下文都是具有自己的目录和状态的重量级资源,因此您可能希望避免创建过多的实例。

明智的可用性

此:

sqlContext = pyspark.sql.SQLContext(sc)
sqlContext.table("myTable")  

通常不会工作,因为表只存在于特定目录的上下文中,而标准SQLContext使用的是derby实例,无法共享。

如果符合以下条件,则可能会有效:

  • 您使用Hive Metastore(在启用Hive支持的情况下,您需要HiveContext / SparkSession)。
  • mytable是一个表格或全局临时视图。

API明智

SQLContext仅用于遗留原因,不应在新应用中使用。