2017-06-21 34 views
0

我嘗試分解spark中複雜數據框的結構。我只對根目錄下的嵌套數組感興趣。問題是我無法從StructField的類型中檢索ElementType。如何提取ArrayType的ElementType作爲StructType的實例

下面是一個例子,此架構一個StructType對象:

df.printSchema 
result>> 
root 
|-- ID: string (nullable = true) 
|-- creationDate: string (nullable = true) 
|-- personsList: array (nullable = true) 
| |-- element: struct (containsNull = true) 
| | |-- firstName: string (nullable = true) 
| | |-- lastName: string (nullable = true) 

每StructType是

FieldType (name, type, nullable , metadata). 

陣列我試圖代碼如下:

val personsList = df.schema("personsList") // personsList is a StructField 
println(passengersList.dataType) 

我想要檢索ElementType來獲得嵌套數組的StructType,但不幸的是我們只有typeName或json方法。

最好的問候,

回答

1

您可以選擇arraystructelements,並獲得dataType

VAL arraydf = df.select( 「personsList.firstName」, 「personsList.lastName」) arraydf.schema .foreach(X =>的println(x.dataType))

這會給以下的dataType

ArrayType(StringType,true) 
ArrayType(StringType,true) 

上面的方式給了我猜想不是你所需要的arrayType。你可以去搶先一步使用explodefunction

val arraydf = df.select(explode($"personsList.firstName")) 
arraydf.schema.foreach(x => println(x.dataType)) 

這將打印

StringType 

我希望這是你想要的。如果不是,它會給你的想法:)

+0

謝謝你,我有一個問題:我只在架構感興趣,我想知道「中選擇」聲明還檢索記錄也就算我們不顯示或使用他們。 (我應該有數百萬條記錄,我不會使用它們),你覺得呢? –

+0

是,'select'語句將產生選中的列新的數據幀。但是,如果您不使用選定的數據框,則應該在超出範圍時收集垃圾。所以你不必擔心有數百萬條記錄。 –

+0

謝謝你的時間 –

相關問題