需要RDD的实例但是返回了类'pyspark.rdd.PipelinedRDD'

时间:2017-06-04 14:56:29

标签: python apache-spark spark-dataframe rdd

嗨,我在笔记本中有这个代码,并且代码为python spark:

 mydataNoSQL.createOrReplaceTempView("mytable")
 spark.sql("SELECT * from mytable")
 return mydataNoSQL

def getsameData(df,spark):
result = spark.sql("select * from mytable where temeperature is not null")
return result.rdd.sample(False, 0.1).map(lambda row : (row.temperature))

我需要一个实例RDD,但我正在创建一个类'pyspark.rdd.PipelinedRDD'

任何帮助都会很好。

1 个答案:

答案 0 :(得分:3)

pyspark.rdd.PipelinedRDDRDD的子类,必须在RDD中定义所有API。即。 PipelinedRDD只是RDD的特殊类型,它是在RDD上运行地图函数时创建的。

例如,请看下面的代码段。

>>> rdd = spark.sparkContext.parallelize(range(1,10))
>>> type(rdd)
<class 'pyspark.rdd.RDD'> ## the type is RDD here
>>> rdd = rdd.map(lambda x: x * x)
>>> type(rdd)
<class 'pyspark.rdd.PipelinedRDD'> ## after the map operation the type is changed to pyspark.rdd.PipelinedRDD

因此,您只需将pyspark.rdd.PipelinedRDD视为代码中的RDD即可。

Python中没有完整的转换支持,因为它是动态类型语言。强制将你的pyspark.rdd.PipelinedRDD转换为正常的RDD,你可以在rdd上收集它并将其并行化

>>> rdd = spark.sparkContext.parallelize(rdd.collect())
>>> type(rdd)
<class 'pyspark.rdd.RDD'>

如果rdd的数据很大,则在RDD上运行collect可能会导致MemoryError