如何拼合火花数据帧的行到多个数据帧的行
问题描述:
您好我有它打印这样的(单列)火花数据帧如何拼合火花数据帧的行到多个数据帧的行
[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]
答
绝对不是最好的解决方法,但这会工作:
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
答
谢谢回答@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
希望这是可以理解的:)
谢谢回答,我在这里跟进问题如果我有3个数组[abc,WrappedArray(11918,1233),WrappedArray(46734,1234),WrappedArray(1,2),1487530800317] –
如果你可以回答你可以投票而不是o谢谢! –