首页 > 解决方案 > Spark:写入镶木地板文件时不理解的行为 - 数据类型

问题描述

我有这样的 csv 记录:

--------------------------- 
name | age | entranceDate | 
---------------------------
Tom  | 12  | 2019-10-01   |
---------------------------
Mary | 15  | 2019-10-01   | 

我从 CSV 读取它并使用自定义模式将其转换为 DataFrame:

public static StructType createSchema() {
    final StructType schema = DataTypes.createStructType(Arrays.asList(
            DataTypes.createStructField("name", DataTypes.StringType, false),
            DataTypes.createStructField("age", DataTypes.StringType, false),
            DataTypes.createStructField("entranceDate", DataTypes.StringType, false)
    ));
    return schema;
}


sqlContext.read()
                .format("com.databricks.spark.csv")
                .option("inferSchema", "false")
                .option("delimiter", FIELD_DELIMITER)
                .option("header", "false")
                .schema(schema)
                .load(pathToMyCsvFile);

现在我想将此数据框写入我的 hdfs 上的镶木地板:

String[] partitions =
new String[] {
  "name",
  "entranceDate"
};

df.write()
.partitionBy(partitions)
.mode(SaveMode.Append)
.parquet(parquetPath);

但是当我在 spark-shell 中检查镶木地板的架构时:

sqlContext.read.parquet("/test/parquet/name=Tom/entranceDate=2019-10-01/").printSchema()

它显示entranceDateis 类型Date。我想知道那是怎么回事?我已经指定这个字段应该是String,它如何自动转换为Date

--------------

编辑:我做了一些测试,发现只有在我.partitionBy(partitions)写作时它才会转换为日期。如果我删除此行并打印架构,它将显示类型entranceDateString

标签: javascalaapache-spark

解决方案


我会说这是因为自动模式推断机制。Spark文档页面

请注意,分区列的数据类型是自动推断的。目前支持数字数据类型、日期、时间戳和字符串类型。

有时用户可能不想自动推断分区列的数据类型。对于这些用例,自动类型推断可以通过 配置 spark.sql.sources.partitionColumnTypeInference.enabled,默认为true


推荐阅读