Spark DataSet有效地获取整行的长度大小

问题描述

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);
}

解决方法

我正在使用不同大小的dataSet每个具有动态列大小-对于我的应用程序,我需要知道字符的整个行长,以估计整个行大小(以字节或千字节为单位)。

整个行大小(以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[]然后返回列的整个长度。而不是嵌套操作。

  1. 有什么办法可以帮助我进行此类操作的UDF功能?还是有这种功能的现有功能?
  2. 使用这种解决方案有多糟糕?

首选Java解决方案。

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”