Tengo un registro csv como esto:
---------------------------
name | age | entranceDate |
---------------------------
Tom | 12 | 2019-10-01 |
---------------------------
Mary | 15 | 2019-10-01 |
Lo leí desde CSV y lo convierten en una trama de datos, utilizando un esquema personalizado:
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);
Ahora quiero escribir esta trama de datos de parquet en mis hdfs:
String[] partitions =
new String[] {
"name",
"entranceDate"
};
df.write()
.partitionBy(partitions)
.mode(SaveMode.Append)
.parquet(parquetPath);
Pero cuando compruebo el esquema del parquet en chispa-shell:
sqlContext.read.parquet("/test/parquet/name=Tom/entranceDate=2019-10-01/").printSchema()
que muestra el entranceDate
es de tipo Date
. Me pregunto cómo es eso? Ya especificar que este campo debe ser String
, ¿cómo puede convertir automáticamente a Date
?
--------------
Editar : Hice algunas pruebas y encontró que convierte hasta la fecha sólo si lo hago .partitionBy(partitions)
al escribir. Si quito esta línea e imprimir el esquema, se mostrará el tipo de entranceDate
ISString
Yo diría que eso sucede porque el mecanismo automática del esquema de inferencia. Documentación chispa página dice
Tenga en cuenta que los tipos de datos de las columnas de partición se deducen automáticamente. Actualmente, los tipos de datos numéricos, fecha, fecha y hora y el tipo de cadena son compatibles.
A veces, los usuarios pueden no querer inferir automáticamente los tipos de datos de las columnas de partición. Para estos casos de uso, la inferencia de tipo automático se puede configurar
spark.sql.sources.partitionColumnTypeInference.enabled
, por defecto, que es atrue
.