Остановить упорядочение столбцов набора данных при записи в CSV - PullRequest
0 голосов
/ 09 апреля 2020

Я хочу записать набор данных в файл CSV, но не хочу, чтобы столбцы упорядочивались в порядке возрастания (или в любом другом порядке).

Например, Таблица: идентификатор строки; Имя строки; Струнный возраст; Еще +300 полей

CSV сформирован из схемы: идентификатор возраста ID +300 больше столбцов в алфавитном порядке

, но я хочу CSV того же порядка, что и для модели.

Я мог бы использовать методы .select () или .selectExpr (), но там я должен был упомянуть более 300 полей.

Есть ли другой способ, более простой.

В настоящее время используется:

dataset.toDF().coalesce(1).selectExpr("templateId","batchId", +300 more fields       ).write().format("com.databricks.spark.csv").option("nullValue","").mode(SaveMode.Overwrite).save(path);

1 Ответ

0 голосов
/ 18 апреля 2020

Обходной путь, который я использовал для вышеуказанного вопроса:

  1. добавил поля в файле свойств (column.properties) под одним ключом с полями, разделенными запятыми.
  2. загружен этот файл свойств в широковещательной карте.
  3. используется широковещательная карта в методе .selectExpr ().

Код для загрузки файла свойств в широковещательной карте:

    public static Map<String, String> getColumnMap() {

            String propFileName = "column.properties";
            InputStream inputStream = 
            ConfigurationLoader.class.getClassLoader().getResourceAsStream(propFileName);
            if (inputStream != null) {
                try {
                    prop.load(inputStream);
                    colMap = (Map) prop;
                } catch (IOException e) {
                    // handle exception
                }
            }
            return colMap;
        }

JavaSparkContext sc = JavaSparkContext.fromSparkContext(sparkSession.sparkContext());
Broadcast<Map<String, String>> broadcastProperty = sc.broadcast(propertiesMap);

Код для записи в файл CSV:

dataset.toDF().coalesce(1).selectExpr(broadcastColumn.getValue().get(TemplateConstants.COLUMN).split(",")).write().format(ApplicationConstants.CSV_FORMAT).option(ApplicationConstants.NULL_VALUE, "").mode(SaveMode.Overwrite).save(path);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...