我正致力于使用PySpark处理从.json和.csv文件读取的数据的PCA分析。当我使用.csv文件大小仅为77Mo时,我出现内存不足错误,而使用.json的数据时,它可以处理超过1.2Go的内存。 任何解释? ps:我在独立模式下工作。 这是我的json代码:
df = sqlContext.read.json("bigdata.json")
vecAssembler = VectorAssembler(inputCols=["sepal_width", "sepal_length", "petal_width", "petal_length"], outputCol="features")
pca = PCA(k=2, inputCol="features", outputCol="pcaFeatures")
pipeline = Pipeline(stages=[vecAssembler, pca])
model = pipeline.fit(df)
result = model.transform(df).select("pcaFeatures")
result.show(truncate=False)
这是我的csv代码:
fileObj = sc.textFile('iris.csv')
data = fileObj.map(lambda line: [float(k) for k in line.split(';')]).collect()
columns = (fileObj.first()).split(';')
df = spark.createDataFrame(data, columns)
vecAssembler = VectorAssembler(inputCols=columns, outputCol="features")
pca = PCA(k=2, inputCol="features", outputCol="pcaFeatures")
pipeline = Pipeline(stages=[vecAssembler, pca])
model = pipeline.fit(df)
result = model.transform(df).select("pcaFeatures")
result.show(truncate=False)
答案 0 :(得分:1)
原因在于您的行:
data = fileObj.map(lambda line: [float(k) for k in line.split(';')]).collect()
最好的过程是这样做的:
data = fileObj.map(lambda line: [float(k) for k in line.split(';')])
columns = (fileObj.first()).split(';')
df = data.toDF(columns)
使用collect()
,您将所有数据从执行者发送到您的驱动程序。这应该可以解决问题
答案 1 :(得分:1)
您需要重写代码。为了更好地理解,Spark适用于惰性求值。它几乎没有收集或实际处理数据的函数,router.get('/fees/cfees', function(req, res) {
res.render('cfees')
});
,collect
,first
,head
。
所以在这里,您将在第一步收集数据。因此,无需在开始时编写show
函数。除此之外一切都很好。
collect
基本上从所有执行程序收集数据并加载驱动程序。
因此,在此Collection
行之后,您的所有任务都在单个驱动程序/执行程序上执行。
fileObj.map(lambda line: [float(k) for k in line.split(';')]).collect()