2016-12-04 56 views
1

我從另一個自定義Java類的模式創建StructType,我可以從中提取列名和數據類型。創建Spark SQL的StructType:使用add方法或構造函數?

據我所知,好像有是構建一個StructType雙向:

  1. 使用add method
  2. 使用constructor passing in an array of StructField

我基本上可以通過使用這兩種方法,因爲我圈我的自定義模式類逐個提取字段。問題是,似乎add方法會在每次被調用時創建一個新的StructType,這似乎是不必要的複雜的處理方式,所以我實際上想知道每次調用它時是否會創建一個新的對象。如果沒有,我想通add比創建StructField

回答

2

一個新的ArrayList如果您檢查StructType類的源代碼,你會看到,添加方法更好的方法調用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()); 
    } 
} 
+0

我不知道爲什麼他們決定創建一個新的對象,每次因爲它看起來像它很容易實現,而無需創建一個新的對象 –

+1

爲了保持StructType不變。 – abaghel

+0

啊我明白了。遵守功能編程? –

相關問題