我正在处理不同大小的dataSet,每个都有一个动态大小的列 - 对于我的应用程序,我需要知道字符的整行长度,以便以字节或KB为单位估算整个行的大小。
整行大小(以KB为单位)的结果将写入新列。
private void writeMyData(Dataset<Row> dataSet){
Column[] columns = Arrays.stream(dfToWrite.columns()).map(col-> functions.col(col)).toArray(Column[]::new);
dataSet.withColumn("marker", functions.length(functions.concat_ws( dataSet.columns()[3],columns))).write().partitionBy(hivePartitionColumn)
.option("header", "true")
.mode(SaveMode.Append).format(storageFormat).save(pathTowrite);
}
由于我没有org.apache.spark.sql.functions返回Column[]
的方法
所以我不得不使用dataSet.columns()
并收集它。
但每次使用嵌套操作function.method
似乎效率不高。
我希望函数大小得到Column[]
并返回列的整个长度。
而不是嵌套操作。
首选Java解决方案。
答案 0 :(得分:0)
使用spark Dataframe UDF的漂亮解决方案我已经习惯于获得Bytes长度,这对我的情况更好:
static UDF1 BytesSize = new UDF1<String, Integer>() {
public Integer call(final String line) throws Exception {
return line.getBytes().length;
}
};
private void saveIt(){
sparkSession.udf().register("BytesSize",BytesSize,DataTypes.IntegerType);
dfToWrite.withColumn("fullLineBytesSize",callUDF("BytesSize",functions.concat_ws( ",",columns)) ).write().partitionBy(hivePartitionColumn)
.option("header", "true")
.mode(SaveMode.Append).format(storageFormat).save(pathTowrite);
}