Python pyspark rdd到数据帧给出“;无法减少()空RDD“;使用自定义采样率

Python pyspark rdd到数据帧给出“;无法减少()空RDD“;使用自定义采样率,python,dataframe,pyspark,rdd,Python,Dataframe,Pyspark,Rdd,我有一个pyspark rdd,并试图使用一些自定义采样率将其转换为数据帧。但我有时会遇到一个错误,即空rdd不能用于创建数据帧 ValueError:无法减少()空RDD 下面是我的代码。正如我所说,它并不总是出错。只有在某些时候,它是失败的 from pyspark import SparkContext from pyspark.sql import SQLContext sc = SparkContext() sqlContext = SQLContext(sc) myrdd = s

我有一个pyspark rdd,并试图使用一些自定义采样率将其转换为数据帧。但我有时会遇到一个错误,即空rdd不能用于创建数据帧

ValueError:无法减少()空RDD

下面是我的代码。正如我所说,它并不总是出错。只有在某些时候,它是失败的

from pyspark import SparkContext
from pyspark.sql import SQLContext
sc = SparkContext()
sqlContext = SQLContext(sc)


myrdd = sc.parallelize([
    (1, 638.55),
    (2, 638.55),
    (3, 638.55),
    (4, 638.55),
    (5, 638.55)
])

for i in range(100):
    print(i)
    df2 = sqlContext.createDataFrame(myrdd, samplingRatio=0.4)

当我将采样率设为1时,它不会失败。我不知道为什么不一致。或者我遗漏了关于采样率的任何一点吗?

正如您可能已经知道的,大多数spark操作都是通过内部RDD调用完成的。 如果您查看错误的堆栈跟踪(我复制了您的错误),您将遇到这一行

/usr/local/spark/python/pyspark/sql/session.py in _inferSchema(self, rdd, samplingRatio, names)
    380             if samplingRatio < 0.99:
    381                 rdd = rdd.sample(False, float(samplingRatio))
--> 382             schema = rdd.map(lambda row: _infer_schema(row, names)).reduce(_merge_type)
    383         return schema
    384 
因此,对于一致的行为,您需要为初始的
myrdd
使用足够大的填充,或者处理异常


您可以阅读更多关于如何在此

中进行采样的信息嗨,请检查我的答案是否是您需要知道的。如果有什么东西不见了或者没有回答,请留下评论,这样我就可以修复它了。如果没有人对答案作出回应,那是相当令人沮丧的。我花了相当长的时间来调查和再现您的错误并提供解释。
myrdd = sc.parallelize([
    (1, 638.55),
    (2, 638.55),
    (3, 638.55),
    (4, 638.55),
    (5, 638.55)
])
for i in range(100):
    rdd2 = myrdd.sample(False, 0.4)
    sampledRdd= rdd2.collect()
    if sampledRdd == []:
        print('got empty')
        break;