使第三行作为数据帧的标题

时间:2019-05-28 15:04:27

标签: apache-spark pyspark apache-spark-sql

我在csv中有一个数据,如下所示,第一行为空白,第二行仅填充了下面的4列,

        201901                201902           201903       201904
A   X   1           0       1       1
B   Y   0           0       1       1
A   Z   1           0       1       1
B   X   1           0       1       1
A   Y   0           0       0       1
B   Z   1           0       0       1
A   X   0           1       0       1
B   Y   1           1       0       0
A   Z   1           1       0       0
B   X   0           1       1       0

如果我将数据读入csv,我将得到如下数据

_c1     _c2     _c3         _c4     _c5     _c6
null           null        null            null       null  null
null           null       201901                201902          201903  201904
A       X       1           0       1       1
B       Y       0           0       1       1
A       Z       1           0       1       1
B       X       1           0       1       1
A       Y       0           0       0       1
B       Z       1           0       0       1
A       X       0           1       0       1
B       Y       1           1       0       0
A       Z       1           1       0       0
B       X       0           1       1       0

我已经读取了没有标题的数据文件,并删除了不需要的标题。现在我想将文件转换为具有标题

df=spark.read.csv("s3://abc/def/file.csv",header=False)
df=df.where(col("_c3").isNotNull())
Type         Source         201901                 201902           201903  201904
A       X       1           0       1       1
B       Y       0           0       1       1
A       Z       1           0       1       1
B       X       1           0       1       1
A       Y       0           0       0       1
B       Z       1           0       0       1
A       X       0           1       0       1
B       Y       1           1       0       0
A       Z       1           1       0       0
B       X       0           1       1       0

1 个答案:

答案 0 :(得分:-1)

您可以通过定义类似这样的自定义模式

val customSchema = StructType(Array(
    StructField("yourcolumnheader", StringType, true),
    StructField("yourcolumnheader2", StringType, true),
    StructField("yourcolumnheader3", IntegerType, true),
    StructField("yourcolumnheader4", DoubleType, true)))

然后在读取格式化的文件时使用该架构,即删除了3行CSV文件

df=spark.read.csv("s3://abc/def/file.csv",header=False)
.schema(customeSchema)

希望能回答您的问题。