Chispa: no se entiende el comportamiento al escribir en el archivo de parquet - tipos de datos

google_tech_lead:

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 entranceDatees 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 entranceDateISString

Yauheni:

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 a true.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=330387&siteId=1
Recomendado
Clasificación