Как эффективно получить максимальную длину записи кадра данных - PullRequest
0 голосов
/ 07 августа 2020

Как узнать размер самой длинной записи (строки) набора данных в байтах.

У меня довольно большой фрейм данных с переменной длиной записи (строки), и я хочу узнать длину строки с наибольшей полезной нагрузкой.

В нем миллионы \ миллиарды строк, поэтому я хочу знать способ, который эффективен и не повлияет на производительность.

У меня DataFrameWriter в качестве входных данных.

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Возможно, это полезно -

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  |
      * +-----+
      */
0 голосов
/ 07 августа 2020

Проверьте код ниже.

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>
...