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

Posted

技术标签:

【中文标题】Spark DataSet 有效地获取整行的长度大小【英文标题】:Spark DataSet efficiently get length size of entire row 【发布时间】:2018-03-22 08:06:38 【问题描述】:

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

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

    有没有一种方法可以帮助我使用 UDF 功能进行此类操作? 或者这种操作有现成的功能吗? 使用这种解决方案有多糟糕?

Java 解决方案是首选。

【问题讨论】:

【参考方案1】:

我用 spark Dataframe UDF 的不错的解决方案来获取字节长度,这对我的情况来说更好:

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

【讨论】:

以上是关于Spark DataSet 有效地获取整行的长度大小的主要内容,如果未能解决你的问题,请参考以下文章

大数据Spark Dataset

获取整行的最佳方法,其中某列 = 某个值?

如何根据 s-s-rS 中单独字段的值有条件地格式化整行的文本颜色?

根据列值有效地从宽 Spark Dataframe 中删除列

`filter`/`where` 有条件地应用到 Spark `Dataset`/`Dataframe`

小白学习MySQL - varchar类型字段为什么经常定义成255?