Искра: непонятное поведение при записи в файл паркета - типы данных - PullRequest
3 голосов
/ 23 сентября 2019

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

1 Ответ

5 голосов
/ 23 сентября 2019

Я бы сказал, что это происходит из-за механизма автоматического вывода схемы.Документация Spark page говорит

Обратите внимание, что типы данных столбцов разделения автоматически выводятся.В настоящее время поддерживаются числовые типы данных, дата, отметка времени и строковый тип.

Иногда пользователи могут не захотеть автоматически выводить типы данных столбцов разделения.Для этих случаев использования автоматический вывод типа может быть настроен на spark.sql.sources.partitionColumnTypeInference.enabled, который по умолчанию равен true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...