创建 Spark SQL 的 StructType:使用 add 方法还是构造函数?

Posted

技术标签:

【中文标题】创建 Spark SQL 的 StructType:使用 add 方法还是构造函数?【英文标题】:Creating Spark SQL's StructType: use add method or a constructor? 【发布时间】:2016-12-04 03:24:11 【问题描述】:

我正在从另一个自定义 Java 类的架构创建 StructType,我可以从中提取列名和数据类型。

据我所知,构造 StructType 似乎有两种方法:

    使用add method 使用constructor passing in an array of StructField

我基本上可以使用这两种方法,因为我循环遍历我的自定义模式类以逐个提取字段。问题是,似乎add 方法每次被调用时都会创建一个新的 StructType,这似乎是不必要的复杂处理方式,所以我实际上想知道它是否真的会创建一个新的每次调用对象。如果没有,我认为add 比创建StructField 的新ArrayList 更好

【问题讨论】:

【参考方案1】:

如果您查看 StructType 类的源代码,您会看到 add 方法调用 StructType 构造函数和 new StructField,因此它将创建新的 StructType。

def add(name: String, dataType: DataType): StructType = 
    StructType(fields :+ new StructField(name, dataType, nullable = true, Metadata.empty))

您可以使用下面的示例程序进行验证。

public class QuickTest 
public static void main(String[] args) 
    SparkSession sparkSession = SparkSession
            .builder()
            .appName("QuickTest")
            .master("local[*]")
            .getOrCreate();
    //StructType
    StructType st1 = new StructType().add("name", DataTypes.StringType);
    System.out.println("hashCode "+st1.hashCode());
    System.out.println("structType "+st1.toString());

    //add
    st1.add("age", DataTypes.IntegerType);
    System.out.println("hashCode "+st1.hashCode());
    System.out.println("structType "+st1.toString());

    //add and assign
    StructType st2 = st1.add("age", DataTypes.IntegerType);
    System.out.println("hashCode "+st2.hashCode());
    System.out.println("structType "+st2.toString());

    //constructor
    StructType st3 = new StructType(new StructField[] new StructField("name", DataTypes.StringType, true, null), new StructField("age", DataTypes.IntegerType, true, null));
    System.out.println("hashCode "+st3.hashCode());
    System.out.println("structType "+st3.toString());
  

【讨论】:

我想知道为什么他们决定每次都创建一个新对象,因为看起来很容易实现它而无需创建新对象 保持 StructType 不可变。 啊,我明白了。遵守函数式编程?

以上是关于创建 Spark SQL 的 StructType:使用 add 方法还是构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark 中执行聚合函数时出错:ArrayType 无法转换为 org.apache.spark.sql.types.StructType

从 org.apache.spark.sql.types.StructType 生成 AvroSchema

如何将具有嵌套StructType的列转换为Spark SQL中的类实例?

Spark Sql: TypeError("StructType 不能接受类型为 %s 的对象" % type(obj))

我们如何在 Spark 中使用 Dataframes(由 structtype 方法创建)合并具有不同列数的 2 个表?

如何在 Spark 中将 Avro Schema 对象转换为 StructType