【问题标题】:Spark: not understood behaviour when writing to parquet file - datatypesSpark:写入镶木地板文件时不理解的行为 - 数据类型
【发布时间】:2019-09-23 13:56:12
【问题描述】:

我有这样的 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()

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

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

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

【问题讨论】:

    标签: java scala apache-spark


    【解决方案1】:

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

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

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

    【讨论】:

    • @brest1007 您可以在执行spark-submit 时使用SparkConf 对象或通过动态加载的属性更改spark.sql.sources.partitionColumnTypeInference.enabled 选项。查看Spark Configuration 页面以查找所有必要的详细信息。
    猜你喜欢
    • 1970-01-01
    • 2019-06-02
    • 2015-10-27
    • 2017-03-17
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    相关资源
    最近更新 更多