Python pyspark rdd到数据帧给出“;无法减少()空RDD“;使用自定义采样率
我有一个pyspark rdd,并试图使用一些自定义采样率将其转换为数据帧。但我有时会遇到一个错误,即空rdd不能用于创建数据帧 ValueError:无法减少()空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
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;