我想为spark Estimator
编写自定义Pipelines
。它应该执行数据清理任务。这意味着将删除一些行,删除一些列,添加一些列,在现有列中替换一些值。 IT还应将某些数字列的均值或分钟存储为NaN替换。
然而,
override def transformSchema(schema: StructType): StructType = {
schema.add(StructField("foo", IntegerType))
}
仅支持添加字段? 我很好奇我应该如何处理这个问题。
答案 0 :(得分:2)
您是正确的,StructField
api仅支持添加字段。但是,这并不意味着您也无法删除字段!
StructType
有一个价值成员fields
,会为您提供Array[StructField]
。您可以在.filter()
,name
或其他更复杂的内容dataType
这个数组StructField
,只保留您想要的列。
完成过滤后,您有两种选择:
fields
到已过滤的StructType
数组,并从此StructType
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;
}
添加新列。