apache-spark - 在写入 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);
解决方案
我针对上述问题采取的解决方法:
- 将属性文件(column.properties)中的字段添加到单个键下,字段以逗号分隔。
- 在广播地图中加载该属性文件。
- 在 .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);
推荐阅读
- node.js - 通过节点请求模块下载的图像已损坏
- python - 如何在 pandas 中正确找到偏度和峰度?
- perl - 如何使用 Perl 的 PDF::API2 以 PDF 格式呈现复选框
- html - 我的网页被截断,无法在移动设备上滚动
- node.js - 长时间后如何保持请求打开以使用 write() 方法
- c++ - 在哪里可以找到 Linux 中触摸屏显示器的最大分辨率?
- javascript - 在承诺回调中发送数组响应,但响应为空白
- javascript - 使用 JavaScript 从应用内浏览器重定向到 Android 上的 Google Chrome
- matlab - 如何在 Matlab 中训练具有 MFCC 系数的神经网络 LSTM
- .htaccess - 您如何订购在子目录中安装 Wordrpess 并强制使用 HTTPS 的重写规则?