2017-10-10 88 views
1

我按幾列分組,正在從這些列中得到WrappedArray,正如您在架構中所見。我如何擺脫它們,以便我可以繼續下一步並執行orderBy如何在Spark中獲得WrappedArray的第一個值?

val sqlDF = spark.sql("SELECT * FROM 
    parquet.`parquet/20171009121227/rels/*.parquet`") 

得到一個數據框:

val final_df = groupedBy_DF.select(
    groupedBy_DF("collect_list(relev)").as("rel"), 
    groupedBy_DF("collect_list(relev2)").as("rel2")) 

然後打印模式給了我們:final_df.printSchema

|-- rel: array (nullable = true) 
| |-- element: double (containsNull = true) 
|-- rel2: array (nullable = true) 
| |-- element: double (containsNull = true) 

樣品電流輸出:

enter image description here

我想轉換成這樣:

|-- rel: double (nullable = true) 
|-- rel2: double (nullable = true) 

期望中的例子輸出(從上面的圖片):

-1.0,0.0 
-1.0,0.0 
+0

collect_list肯定會創建一個WrappedArray。您是否可以提供樣本輸出作爲您希望輸出數據框的方式? –

+0

@RameshMaharjan我添加了所需的輸出 – dedpo

+0

如果你有更多的這一行的組?即如果你有[WrappedArray(-1.0,1.0),WrappedArray(0.0,0.0)]?您打算如何將其轉換爲最終的輸出數據框? –

回答

1

的情況下collect_list會總是隻返回一個值,用first代替。那麼就沒有必要處理有數組的問題了。請注意,這應該在groupBy步驟中完成。

val spark = SparkSession.builder.getOrCreate() 
import spark.implicits._ 

val final_df = df.groupBy(...) 
    .agg(first($"relev").as("rel"), 
     first($"relev2").as("rel2")) 
+0

這是如何在spark類中不起作用的,它通過'REPL..agg(first($「relev」)。as(「rel」)'特別適用。agg似乎沒有編譯和拋出錯誤 – dedpo

+0

@dedpo什麼是錯誤?執行'agg'你首先需要使用'groupBy',因此,我提到它需要在這一步中完成。 'import spark.implicits._'正確完成並且括號正確(在你的評論中你缺少'''')。 – Shaido

+0

要像上面的將來,分組/ AGG人可能需要使用'進口org.apache.spark.sql.functions.col'所以,'df.groupBy(...) .agg(COL(第一($ 「relev」))。as(「rel」)'。另一種方法是使用DataFrame並使用reparition然後sortwithPartitions – dedpo

0

嘗試col(x).getItem

groupedBy_DF.select(
    groupedBy_DF("collect_list(relev)").as("rel"), 
    groupedBy_DF("collect_list(relev2)").as("rel2") 
).withColumn("rel_0", col("rel").getItem(0)) 
相關問題