【发布时间】: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()
它显示entranceDate 是Date 类型。我想知道那是怎么回事?我已经指定这个字段应该是String,如何自动转换为Date?
-------------
编辑 :我做了一些测试,发现只有当我在写作时使用.partitionBy(partitions) 时它才会转换为日期。如果我删除此行并打印架构,它将显示entranceDate 的类型为String
【问题讨论】:
标签: java scala apache-spark