使用定义的列名而不是使用数据框的列名来编写镶木地板文件

时间:2019-07-26 06:09:08

标签: scala dataframe apache-spark parquet

我对scala还是很陌生,不确定如何深入研究。 我有一个包含许多列的数据框,如下所示:

+---+-----+--------+--------+
| _1|_2._1|_2._2._1|_2._2._2|
+---+-----+--------+--------+
|  1|    2|       3|       4|
+---+-----+--------+--------+

我将其写入拼花地板,但是我已经有了一个包含将在下面的parquert中的列名的架构:

  val abcSchema = StructType(Array(
    StructField("ModID", StringType),
    StructField("ProGroupId", StringType),
    StructField("ProdId", StringType),
    StructField("SegId", StringType),
    StructField("Date", DateType),
    StructField("MShare", DoubleType),
    StructField("MtId", IntegerType),
    StructField("Flag", BooleanType),
    StructField("ProType", StringType),
    StructField("abc", StringType),
    StructField("xyz", StringType),
    StructField("ghi", DoubleType),
    StructField("jkl", DoubleType),
    StructField("mno", DoubleType),
    StructField("pqr", DoubleType),
    StructField("stu", DoubleType),
    StructField("wxy", DoubleType),
    StructField("zyw", DoubleType),
    StructField("pou", DoubleType),
    StructField("hyt", DoubleType),
    StructField("kpol", DoubleType),
    StructField("uyt", DoubleType),
    StructField("qwre", DoubleType),
    StructField("jgt", DoubleType),
    StructField("lpou", DoubleType),
    StructField("qret", DoubleType),
    StructField("cvd", DoubleType),
    StructField("bnhy", DoubleType),
    StructField("nnn", DoubleType),
    StructField("loi", DoubleType),
    StructField("kql", DoubleType)
  ))

实木复合地板文件的最终结果应该是这样

+------+----------+--------+--------+
| ModID|ProGroupId|ProdId  |abc     |
+------+----------+--------+--------+
|  1   |    2     |       3|       4|
+------+----------+--------+--------+ 

我已经编写了以下代码,以使用代码创建镶木地板

val result = Try({

      dataFrame
        .write
        .mode(SaveMode.Overwrite)
        .format("parquet")
        .partitionBy("Date")
        .save(outputPath)
    })

但是,我不确定,如何将“ abcSchema”传递到上面的代码中,以使用必填列来编写实木复合地板。 谁能帮我吗?

1 个答案:

答案 0 :(得分:0)

在读取数据框本身然后写入时加载架构。

spark.read.format("<format>")
     .option("<key>", "<value>")
     .schema(abcSchema)
     .load("<path-to-file>")