如何检查我的数据框中的每个记录大小

Posted

技术标签:

【中文标题】如何检查我的数据框中的每个记录大小【英文标题】:How to check each record size in my dataframe 【发布时间】:2018-12-05 06:42:15 【问题描述】:

尝试重新分区我的数据框以实现并行性。建议每个分区大小应小于 128MB ,为了实现它,我需要计算我的数据框中每行的大小。那么如何计算/查找我的数据框中每行的大小?

谢谢。

【问题讨论】:

您可以查看此链接:***.com/questions/30592660/… @DrissNejjar 非常感谢,如何从数据框中获取一行并找出它的大小?如果是这样,我们该怎么做? 您是在寻找稳定的生产解决方案还是仅提供一种解决方案? 这是个好问题!如何在生产环境中完成? 【参考方案1】:

正如我在第一条评论中提到的链接中所述,您可以使用java.lang.instrument

我提出的解决方案是JavaMavenSpark 2.4.0

您必须具有以下结构,否则您必须使 pom.xml 适应您的结构:

src
--main
----java
------size
--------Sizeof.java
------spark
--------SparkJavaTest.java
----resources
------META-INF
--------MANIFEST.MF

pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.formation.SizeOf</groupId>
    <artifactId>SizeOf</artifactId>
    <version>1.0-SNAPSHOT</version>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifestFile>
                        src/main/resources/META-INF/MANIFEST.MF
                    </manifestFile>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>
                            spark.SparkJavaTest
                        </mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id> <!-- this is used for inheritance merges -->
                    <phase>package</phase> <!-- bind to the packaging phase -->
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
    <dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.11</artifactId>
            <version>2.4.0</version>
        </dependency>
    </dependencies>
</project>

大小

package size;

import java.lang.instrument.Instrumentation;

final public class Sizeof 
    private static Instrumentation instrumentation;

    public static void premain(String args, Instrumentation inst) 
        instrumentation = inst;
    

    public static long sizeof(Object o) 
        return instrumentation.getObjectSize(o);
    

SparkJavaTest

package spark;

import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import size.Sizeof;

public class SparkJavaTest 
    public static SparkSession spark = SparkSession
            .builder()
            .appName("JavaSparkTest")
            .master("local")
            .getOrCreate();


    public static void main(String[] args) 

        Dataset<Row> ds = spark.read().option("header",true).csv("sample.csv");

        ds.show(false);
// Get the size of a Dataset
        System.out.println("size of ds " + Sizeof.sizeof(ds));

        JavaRDD dsToJavaRDD = ds.toJavaRDD();
// Get the size of a JavaRDD
        System.out.println("size of rdd" + Sizeof.sizeof(dsToJavaRDD));

    

MANIFEST.MF

Manifest-Version: 1.0
Premain-Class: size.Sizeof
Main-Class: spark.SparkJavaTest

之后,你清理并打包:

mvn clean package

然后您可以运行并获取对象的大小:

java -javaagent:target/SizeOf-1.0-SNAPSHOT-jar-with-dependencies.jar -jar target/SizeOf-1.0-SNAPSHOT-jar-with-dependencies.jar 

【讨论】:

以上是关于如何检查我的数据框中的每个记录大小的主要内容,如果未能解决你的问题,请参考以下文章

是否可以遍历我的 SQL 数据库中的每个表并查找其他行中未使用的记录? (PK/FK检查)

检查数据框中的记录数是不是大于零而不使用计数火花

C# - 如何检查用户的输入是不是存在于组合框中(使用的数据绑定项)

如何将我的数组数据显示到文本框中?

如何在 PySpark 中的大型 Spark 数据框中对行的每个子集进行映射操作

如何计算数据框中的唯一行?