2017-02-22 100 views
0

您好我有它打印這樣的(單列)火花數據幀如何拼合火花數據幀的行到多個數據幀的行

[abc,WrappedArray(11918,1233),WrappedArray(46734,1234),1487530800317] 

因此,一個行i已包裹數組內,我想變平,並創建具有用於每個陣列例如上述排單值應變換這樣

[abc,11918,46734,1487530800317] 
[abc,1233,1234,1487530800317] 

東西,所以我就用2排,而不是1數據幀一個數據幀,因此從包裝陣列的每個相應的元件應當在新的行走。 1回答後

編輯1: 如果我有我的輸入3個陣列

WrappedArray(46734,1234,[abc,WrappedArray(11918,1233),WrappedArray(46734,1234),WrappedArray(1,2),1487530800317] 

我的輸出應該是

[abc,11918,46734,1,1487530800317] 
[abc,1233,1234,2,1487530800317] 

回答

0

絕對不是最好的解決方法,但這會工作:

case class TestFormat(a: String, b: Seq[String], c: Seq[String], d: String) 

val data = Seq(TestFormat("abc", Seq("11918","1233"), 
      Seq("46734","1234"), "1487530800317")).toDS 

val zipThem: (Seq[String], Seq[String]) => Seq[(String, String)] = _.zip(_) 

val udfZip = udf(zipThem) 

data.select($"a", explode(udfZip($"b", $"c")) as "tmp", $"d") 
    .select($"a", $"tmp._1" as "b", $"tmp._2" as "c", $"d") 
    .show 

問題是,默認情況下,你不能確定兩個序列的長度是否相等。

可能更好的解決方案是將整個數據幀重新格式化爲模型化數據的結構,例如,

root 
-- a 
-- d 
-- records 
---- b 
---- c 
+0

謝謝回答,我在這裏跟進問題如果我有3個數組[abc,WrappedArray(11918,1233),WrappedArray(46734,1234),WrappedArray(1,2),1487530800317] –

+0

如果你可以回答你可以投票而不是o謝謝! –

0

謝謝回答@swebbo,你回答讓我能完成這一操作:

我這樣做:

import org.apache.spark.sql.functions.{explode, udf} 
import sqlContext.implicits._ 
val zipColumns = udf((x: Seq[Long], y: Seq[Long], z: Seq[Long]) => (x.zip(y).zip(z)) map { 
    case ((a,b),c) => (a,b,c) 
}) 

val flattened = subDf.withColumn("columns", explode(zipColumns($"col3", $"col4", $"col5"))).select(
    $"col1", $"col2", 
    $"columns._1".alias("col3"), $"columns._2".alias("col4"), $"columns._3".alias("col5")) 
flattened.show 

希望這是可以理解的:)