“大” Pyspark数据框写入镶木地板/转换为Pandas数据框

时间:2019-09-02 08:08:11

标签: python pandas pyspark apache-spark-sql

我正在尝试加入许多“小型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')

1 个答案:

答案 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()