新 SQLContext:Spark 1.6 向后兼容 Spark 2.1
New SQLContext: Spark 1.6 backward-compatibility with Spark 2.1
在 IBM DSX 上我遇到了以下问题。
对于 DSX 上的 Spark 1.6 内核,was/is 需要创建新的 SQLContext 对象以避免 metastore_db
和 HiveContext
出现问题:
以下代码片段是使用 Spark 1.6 实现的,运行 用于 Spark 2.0.2,但不适用于 Spark 2.1:
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df = sqlContext.createDataFrame([(1, "a"), (2, "b"), (3, "c"), (4, "d")], ("k", "v"))
df.count()
和
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
properties= {
'jdbcurl': 'JDBCURL',
'user': 'USER',
'password': 'PASSWORD!'
}
data_df_1 = sqlContext.read.jdbc(properties['jdbcurl'], table='GOSALES.BRANCH', properties=properties)
data_df_1.head()
我收到这个错误:
IllegalArgumentException: u"Error while instantiating 'org.apache.spark.sql.hive.HiveSessionState':"
但是,当我第二次执行相同的代码时,它再次起作用。
IIRC,只有 Bluemix 中的遗留 Spark 服务 (bluemix_ipythonspark_16) 才需要创建新的 SQLContext
。 DSX 仅支持较新的服务 (bluemix_jupyter_bundle),其中创建新的 SQLContext
更有可能导致 Hive 出现问题,而不是解决问题。请不加试试。
您可以使用 SQLContext.getOrCreate(sc) 而不是使用 SQLContext(sc) 创建新的 SQLContext。这将 return 现有 SQLContext(如果存在)。
在 IBM DSX 上我遇到了以下问题。
对于 DSX 上的 Spark 1.6 内核,was/is 需要创建新的 SQLContext 对象以避免 metastore_db
和 HiveContext
出现问题:
以下代码片段是使用 Spark 1.6 实现的,运行 用于 Spark 2.0.2,但不适用于 Spark 2.1:
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df = sqlContext.createDataFrame([(1, "a"), (2, "b"), (3, "c"), (4, "d")], ("k", "v"))
df.count()
和
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
properties= {
'jdbcurl': 'JDBCURL',
'user': 'USER',
'password': 'PASSWORD!'
}
data_df_1 = sqlContext.read.jdbc(properties['jdbcurl'], table='GOSALES.BRANCH', properties=properties)
data_df_1.head()
我收到这个错误:
IllegalArgumentException: u"Error while instantiating 'org.apache.spark.sql.hive.HiveSessionState':"
但是,当我第二次执行相同的代码时,它再次起作用。
IIRC,只有 Bluemix 中的遗留 Spark 服务 (bluemix_ipythonspark_16) 才需要创建新的 SQLContext
。 DSX 仅支持较新的服务 (bluemix_jupyter_bundle),其中创建新的 SQLContext
更有可能导致 Hive 出现问题,而不是解决问题。请不加试试。
您可以使用 SQLContext.getOrCreate(sc) 而不是使用 SQLContext(sc) 创建新的 SQLContext。这将 return 现有 SQLContext(如果存在)。