首页 > 解决方案 > 在 PYSPARK 中读取具有可变数量逗号的 CSV 文件作为数据框

问题描述

我有一个逗号分隔的文件,没有标题,每行中有不同数量的项目,用逗号分隔,例如:

a, x1, x2  
b, x3, x4, x5  
c, x6, x7, x8, x9  

第一行仅包含 3 个项目,后续行包含更多项目,因此似乎仅从第一行推断列数,因此它会跳过其他行中第 3 个逗号之后的任何内容,并且数据丢失。

spark = init_spark()
df= spark.read.csv(filename)
print (df.take(3))

我得到:

[Row(_c0='a', _c1=' x1', _c2=' x2'),  
Row(_c0='b', _c1=' x3', _c2=' x4'),   
Row(_c0='c', _c1=' x6', _c2=' x7')]  

pyspark.sql.readwriter 模块中的mode="PERMISSIVE"
没有解决问题,可能是因为没有header

标签: csvapache-sparkpysparkapache-spark-sql

解决方案


假设已知 col 或逗号分隔值的最大数量并给定文件 a.csv

col_a,col_b,col_c,col_d,col_e
1,2,3,4,5
1,2,3,e
1,a,b
schema = StructType([
    StructField("col_a", StringType(), True),
    StructField("col_b", StringType(), True),
    StructField("col_c", StringType(), True),
    StructField("col_d", StringType(), True),
    StructField("col_e", StringType(), True)
])

df = spark.read.csv("a.csv",header=True,schema=schema)

df.show()

结果

+-----+-----+-----+-----+-----+
|col_a|col_b|col_c|col_d|col_e|
+-----+-----+-----+-----+-----+
|    1|    2|    3|    4|    5|
|    1|    2|    3|    e| null|
|    1|    a|    b| null| null|
+-----+-----+-----+-----+-----+

推荐阅读