Spark自定义预处理估算器

时间:2016-11-19 19:40:15

标签: scala apache-spark apache-spark-sql apache-spark-ml

我想为spark Estimator编写自定义Pipelines。它应该执行数据清理任务。这意味着将删除一些行,删除一些列,添加一些列,在现有列中替换一些值。 IT还应将某些数字列的均值或分钟存储为NaN替换。

然而,

override def transformSchema(schema: StructType): StructType = {
   schema.add(StructField("foo", IntegerType))
}

仅支持添加字段? 我很好奇我应该如何处理这个问题。

1 个答案:

答案 0 :(得分:2)

您是正确的,StructField api仅支持添加字段。但是,这并不意味着您也无法删除字段!

StructType有一个价值成员fields,会为您提供Array[StructField]。您可以在.filter()name或其他更复杂的内容dataType这个数组StructField,只保留您想要的列。

完成过滤后,您有两种选择:

  1. 为每个新列添加fields到已过滤的StructType数组,并从此
  2. 构建StructType
  3. fields数组构建.add(...)并使用 InputStream inputStream = null ; ByteArrayOutputStream output = null; Base64OutputStream output64 = null; byte[] buffer; int bytesRead; String encodedFile; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); buffer = new byte[10240];//specify the size to allow output = new ByteArrayOutputStream(); output64 = new Base64OutputStream(output, Base64.DEFAULT); encodedFile = output64.toString(); } public String getStringFile(File f) { InputStream inputStream = null; try { //Please remember that filePath2 is an object of Uri String uriString = filePath2.toString(); f = new File(uriString).getAbsoluteFile(); inputStream = new FileInputStream(f); while ((bytesRead = inputStream.read(buffer)) != -1) { output64.write(buffer, 0, bytesRead); } output64.close(); encodedFile = output64.toString(); } catch (FileNotFoundException e1 ) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return encodedFile; } 添加新列。