如何处理1GB大CSV文件,合并Text列所有内容?
用PySpark处理1GB大CSV:合并所有Text列内容
没问题,针对你这个1GB超大CSV的合并需求,PySpark绝对是最佳选择——它天生就是为处理无法一次性加载到内存的大文件设计的,完全不用怕内存不够的问题。下面是一步步的具体实现方案:
1. 先准备好PySpark环境
如果还没安装PySpark,先通过pip安装:
pip install pyspark
另外Spark依赖Java,确保你的机器上已经安装了Java 8或以上版本。
2. 初始化SparkSession
这是使用PySpark的第一步,相当于启动Spark的“引擎”:
from pyspark.sql import SparkSession from pyspark.sql.functions import col, concat_ws, collect_list, instr, substring, trim # 初始化SparkSession spark = SparkSession.builder \ .appName("MergeLargeCSVText") \ .getOrCreate()
3. 读取大CSV文件
因为你的Text列包含空格,直接用spark.read.csv会把Text里的空格当成列分隔符,导致数据拆分错误。所以我们用spark.read.text读取每一行的原始字符串,再手动拆分:
# 读取整个CSV文件,包括表头 raw_df = spark.read.text("your_large_file.csv") # 提取表头行,然后过滤掉表头,只保留数据行 header_line = raw_df.first()[0] data_df = raw_df.filter(col("value") != header_line)
4. 拆分并提取Text列内容
我们需要把每一行拆分成Website和Text两部分,这里取第一个空格之前的内容作为Website,剩下的所有内容作为Text(如果你的分隔符是制表符,把下面的" "换成"\t"即可):
# 截取第一个空格之后的所有内容,作为Text列,并去掉前后多余的空格 data_df = data_df.withColumn( "Text", trim(substring(col("value"), instr(col("value"), " ") + 1, 1000000)) # 长度设足够大,覆盖所有可能的Text内容 )
5. 合并所有Text内容到一个单元格
用collect_list把所有Text内容收集成一个列表,再用concat_ws用空格连接成一个完整的字符串:
# 合并所有Text内容,用空格分隔 merged_text = data_df.agg(concat_ws(" ", collect_list(col("Text")))).first()[0]
6. 输出结果到新CSV
最后把合并后的内容做成只有一行一列的DataFrame,写入新的CSV文件:
# 创建结果DataFrame,只有一列"Text" result_df = spark.createDataFrame([(merged_text,)], ["Text"]) # 写入CSV,coalesce(1)确保输出只有一个文件(默认Spark会生成多个分区文件) result_df.coalesce(1).write.csv("merged_result.csv", header=True, mode="overwrite")
一些注意事项
- 如果你的CSV里
Website列本身包含空格(虽然网站地址一般不会有),那需要调整拆分逻辑,比如用更精准的分隔符(比如制表符)来区分列。 coalesce(1)会把所有数据合并到一个分区,虽然会减慢一点速度,但保证输出是单个文件,方便你后续使用。- 运行代码时,Spark会自动分布式处理文件,不需要你手动拆分大文件。
内容的提问来源于stack exchange,提问作者Bashir
相关产品推荐
相关产品推荐

