首页 > 解决方案 > 在写入 CSV 时停止数据集列的排序

问题描述

我想将数据集写入 CSV 文件,但我不希望按升序(或任何顺序)对列进行排序。

例如。表:字符串id;字符串名称;字符串年龄;+300 多个领域

CSV 形成的模式是:年龄名称 id +300 列按字母顺序排列

但我想要与 Model 相同排序的 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);

标签: apache-sparkapache-spark-sql

解决方案


我针对上述问题采取的解决方法:

  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);

推荐阅读