THI*_*ELP 3 java apache-spark apache-spark-sql
我正在StructType从另一个自定义Java类的模式创建一个,我可以从中提取列名和数据类型.
据我所知,似乎有两种方法来构造StructType:
我基本上可以使用这两种方法,因为我遍历我的自定义模式类来逐个提取字段.问题是,似乎add方法每次调用时都会创建一个新的StructType,这似乎是处理它的不必要的复杂方式,所以我实际上想知道每次调用它是否真的会创建一个新对象.如果没有,我认为这add是一种比创建新的ArrayList更好的方法StructField
如果检查StructType类的源代码,您将看到add方法调用 StructType构造函数,new StructField因此它将创建新的StructType.
def add(name: String, dataType: DataType): StructType = {
StructType(fields :+ new StructField(name, dataType, nullable = true, Metadata.empty))
}
Run Code Online (Sandbox Code Playgroud)
您可以使用以下示例程序进行验证.
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());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5874 次 |
| 最近记录: |