我正在尝试加入许多“小型csv”(1000多个文件,每个600万行)。我在胖节点上使用Pyspark(内存:128G,CPU:24核)。但是,当我尝试将此数据帧写到实木复合地板上时。 “发生堆栈溢出”。
sc = SparkContext.getOrCreate(conf=conf)
sqlContext = SQLContext(sc)
bg_f = getfiles('./files')
SName = str(os.path.basename(bg_f[0]).split('.')[0])
schema = StructType([
StructField('CataID', StringType(), True),
StructField('Start_Block', IntegerType(), True),
StructField('End_Block', IntegerType(), True),
StructField(BName, IntegerType(), True)
])
temp = sqlContext.read.csv(bg_f[0], sep='\t', header=False, schema=schema)
for p in bg_f[1:]:
SName = str(os.path.basename(p).split('.')[0])
schema = StructType([
StructField('CataID', StringType(), True),
StructField('Start_Block', IntegerType(), True),
StructField('End_Block', IntegerType(), True),
StructField(BName, IntegerType(), True)
])
cur = sqlContext.read.csv(p, sep='\t', header=False, schema=schema)
temp = temp.join(cur,
on=['CataID', 'Start_Block', 'End_Block'],
how='outer')
temp = temp.drop('CataID', 'Start_Block', 'End_Block')
答案 0 :(得分:1)
发生这种情况是因为您的联接指令重复了行并且占用了内存:
temp.join(cur,
on=['CataID', 'Start_Block', 'End_Block'],
how='outer')
如果仅保留BName列,为什么不只在read.csv之后选择这一列?
temp = sqlContext.read.csv(bg_f[0], sep='\t', header=False, schema=schema).select(BName)
然后您可以使用:
temp = temp.union(cur)
代替join,并在末尾放置重复的行:
temp = temp.distinct()