使用Spark读取表格时如何确定数据大小?

时间:2019-07-03 09:23:21

标签: scala apache-spark

我正在尝试使用spark读取postgres db上的表。为此,我编写了以下内容:

val yearDF = spark.read.format("jdbc").option("url", connectionUrl)
                       .option("dbtable", s"(${execQuery}) as year2016")
                       .option("user", devUserName)
                       .option("password", devPassword)
                       .option("partitionColumn","epochVals")
                       .option("lowerBound", minEp)
                       .option("upperBound", maxEp)
                       .option("numPartitions",15)
                       .load()

为了有效地读取日期和写入输出文件,我试图发现可以找到一些在线资料来确定正在读取的大小数据以及我的工作应使用多少分区,执行器和输出文件来处理数据。我发现了这个link,其中包含与之相关的信息。

该链接提供了一个公式:

number Of Megabytes = M = (N*V*W) / 1024^2
where

    N  =  number of records
    V  =  number of variables
    W  =  average width in bytes of a variable

该链接说明了如何为以下每种数据类型分配权重。

Type of variables                               Width
Integers, −127 <= x <= 100                        1
Integers, 32,767 <= x <= 32,740                   2
Integers, -2,147,483,647 <= x <= 2,147,483,620    4
Floats single precision                           4
Floats double precision                           8
Strings                                           maximum length

源表中的列采用以下格式:

je_header_id:bigint
attribute10:character varying
doc_sequence_value:numeric
reference_date:date
source_transaction:numeric(30,6)
doc_sequence_id:numeric(15,0)
xx_last_update_tms:timestamp without time zone
xx_last_update_log_id:integer
xx_data_hash_id:bigint
xx_pk_id:bigint
mje_flag:character varying(1)

我了解如何根据数字数据类型的定义方式将其视为整数或Double。 我没有得到的是如何给String列赋权。该链接表示给出列中最大字符串的长度。但这是找出最大字符串的昂贵操作。 如果数据类型类似于character varying(100) -- Assuming 100 as weight in worst case,则很容易考虑字符串的最大大小 如果为列提供character varying,而对其大小没有任何限制,则会出现问题。 有人可以让我知道如何获取String列的权重,或者是否还有其他方法可以估算我们将要读取的输入大小?

2 个答案:

答案 0 :(得分:0)

您可以在从源数据库读取数据后获取此值。在阶段中,您可以在输入中获取此值:

enter image description here

答案 1 :(得分:0)

以下代码将以字节为单位给出数据帧的大小,

val df=spark.read.json("file.json") //File size is 151.7MB

println(df.queryExecution.logical.stats.sizeInBytes) //151656689