我有一个用例,我希望迭代地将数据加载到Pandas数据帧中,使用外部函数(即xgboost,未在示例代码中显示)进行一些处理,然后将结果推送到单个PySpark对象(RDD或DF)。
在将数据存储为RDD或Dataframe时,我试图让PySpark溢出到磁盘,而源是Pandas DataFrame。似乎没有什么工作,我一直在崩溃Java驱动程序,我无法加载我的数据。或者,我已经尝试加载我的数据而不处理只使用基本的textFile RDD,它就像一个魅力。我想知道这是否是PySpark错误,或者是否有解决方法。
示例代码:
from pyspark import SparkContext
from pyspark.sql import SQLContext
import pandas as pd
import pyspark
try:
SparkContext.stop(sc)
except NameError:
1
SparkContext.setSystemProperty('spark.executor.memory', '200g')
SparkContext.setSystemProperty('spark.driver.memory', '200g')
sc = SparkContext("local", "App Name")
sql_sc = SQLContext(sc)
chunk_100k = pd.read_csv("CData.csv", chunksize=100000)
empty_df = pd.read_csv("CData.csv", nrows=0)
infer_df = pd.read_csv("CData.csv", nrows=10).fillna('')
my_schema = SQLContext.createDataFrame(sql_sc, infer_df).schema
SparkDF = SQLContext.createDataFrame(sql_sc, empty_df, schema=my_schema)
for chunk in chunk_100k:
SparkDF = SparkDF.union(SQLContext.createDataFrame(sql_sc, chunk, schema=my_schema))
经过几次迭代后崩溃:
Py4JJavaError:调用时发生错误 Z:org.apache.spark.api.python.PythonRDD.readRDDFromFile。 : java.lang.OutOfMemoryError:Java堆空间
直接加载到RDD代码:
my_rdd = sc.textFile("CData.csv") \
.map(lambda line: line.split(",")) \
.filter(lambda line: len(line)>1) \
.map(lambda line: (line[0],line[1]))
更新
我已经更改了代码以在加载到Spark DataFrames而不是RDD时演示失败,请注意问题仍然存在且错误消息仍然引用RDD。 在更改示例代码之前,由于以下原因,在使用“parallelize”时,发现保存到RDD至少存在问题:
答案 0 :(得分:-1)
在apache-spark / 1.5.1 / libexec / conf /中的文件中创建一个spark-defaults.conf文件,并在其中添加以下行: spark.driver.memory 45G spark.driver.maxResultSize 10G