PySpark上的CSV与JSON文件限制

时间:2017-03-08 16:09:36

标签: python json csv apache-spark pyspark

我正致力于使用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)

2 个答案:

答案 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') }); collectfirsthead

所以在这里,您将在第一步收集数据。因此,无需在开始时编写show函数。除此之外一切都很好。

collect基本上从所有执行程序收集数据并加载驱动程序。 因此,在此Collection行之后,您的所有任务都在单个驱动程序/执行程序上执行。

fileObj.map(lambda line: [float(k) for k in line.split(';')]).collect()