【问题标题】:How to get the max length of the record size of a dataframe effectively如何有效地获取数据帧记录大小的最大长度
【发布时间】:2020-11-27 10:30:08
【问题描述】:

如何知道数据集最长记录(行)的大小(以字节为单位)。

我有一个相当大的数据帧,记录(行)长度可变,我想知道有效负载最大的行的长度。

它有数百万\十亿行,所以我想知道一种有效且不会影响性能的方法。

我有 DataFrameWriter 作为输入。

【问题讨论】:

  • 上面的一个更正:我有 DataFrameWriter 或 Dataset 作为输入。

标签: scala apache-spark bigdata


【解决方案1】:

检查下面的代码。

scala> import org.apache.commons.io.FileUtils
import org.apache.commons.io.FileUtils

scala> val bytes = udf((length:Long) => FileUtils.byteCountToDisplaySize(length)) // To disply human readable size.
bytes: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function1>,StringType,Some(List(LongType)))

scala> df
.withColumn("size",length(to_json(struct($"*"))))
.orderBy($"size".desc)
.select(bytes($"size").as("size_in_bytes"))
.show(10,false)
+-------------+
|size_in_bytes|
+-------------+
|49 KB        |
|49 KB        |
|49 KB        |
|48 KB        |
|48 KB        |
|48 KB        |
|43 KB        |
|43 KB        |
|43 KB        |
|42 KB        |
+-------------+
only showing top 10 rows


scala> df
.withColumn("size",length(to_json(struct($"*"))))
.orderBy($"size".desc)
.select($"size".as("size_in_bytes"))
.show(10,false)// Without UDF.
+-------------+
|size_in_bytes|
+-------------+
|50223        |
|50219        |
|50199        |
|50079        |
|50079        |
|50027        |
|44536        |
|44488        |
|44486        |
|43836        |
+-------------+
only showing top 10 rows


scala>

【讨论】:

    【解决方案2】:

    也许这有帮助-

    bit_length

    val df = Seq((1, 2, "hi", "hello")).toDF()
    
        df.selectExpr("max(bit_length(concat_ws('', *)))/8 as bytes")
          .show(false)
        /**
          * +-----+
          * |bytes|
          * +-----+
          * |9.0  |
          * +-----+
          */
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 2011-07-20
      • 2020-06-01
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      相关资源
      最近更新 更多