У меня есть запись в формате 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
is String