PySpark运行报错:'RDD' object has no attribute 'sparkSession' 如何解决
问题原因
这个报错和依赖包无关,完全是代码调用逻辑错误:
SQLContext是类,createDataFrame是它的实例方法,你没有先实例化SQLContext对象,直接调用类方法时,你传入的第一个参数rdd会被方法内部识别为self,才会抛出'RDD' object has no attribute 'sparkSession'的错误。- 代码中
sparkSession=spark的赋值无效,你没有提前初始化SparkSession对象,此处的spark是未定义/无意义变量。 - 单独创建SparkContext的写法是PySpark 1.x的旧用法,2.0之后统一推荐用SparkSession作为唯一入口,无需单独维护SparkContext、SQLContext实例。
修复方案
方案1:直接修正原有写法
from pyspark import SparkContext from pyspark.sql import SQLContext sc = SparkContext(appName="session1") a = [('Chris', 'Budweiser', 15), ('Chris', 'Becks', 5), ('Chris', 'Heineken', 2), ('Bob', 'Becks', 15), ('Bob', 'Budweiser', 10) , ('Bob', 'Heineken', 2) , ('Alice', 'Heineken', 8) ] rdd = sc.parallelize(a) # 先实例化SQLContext对象,传入SparkContext sql_context = SQLContext(sc) df = sql_context.createDataFrame(rdd, ['drinker', 'beer', 'score']) sql_context.registerDataFrameAsTable(df, "drinkers") sc.stop()
方案2:推荐的PySpark 2.0+标准写法(更简洁,无需单独维护多实例)
from pyspark.sql import SparkSession # 初始化SparkSession,直接作为唯一入口 spark = SparkSession.builder.appName("session1").getOrCreate() a = [('Chris', 'Budweiser', 15), ('Chris', 'Becks', 5), ('Chris', 'Heineken', 2), ('Bob', 'Becks', 15), ('Bob', 'Budweiser', 10) , ('Bob', 'Heineken', 2) , ('Alice', 'Heineken', 8) ] # 直接通过SparkSession创建DataFrame df = spark.createDataFrame(a, ['drinker', 'beer', 'score']) # 注册临时表 df.createOrReplaceTempView("drinkers") spark.stop()
内容的提问来源于stack exchange,提问作者Ma Pengfei
相关产品推荐
相关产品推荐

