写入CSV时数据集列的停止顺序

问题描述 投票:-1回答:1

我想将数据集写入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-spark apache-spark-sql spark-java
1个回答
0
投票

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

  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);
© www.soinside.com 2019 - 2024. All rights reserved.