使用Spark 1.5.0并给出以下代码,我希望unionAll根据它们的列名称来联合DataFrame
。在代码中,我使用了一些FunSuite传递在SparkContext sc
:这是怎么回事错`星火unionAll``DataFrame`?
object Entities {
case class A (a: Int, b: Int)
case class B (b: Int, a: Int)
val as = Seq(
A(1,3),
A(2,4)
)
val bs = Seq(
B(5,3),
B(6,4)
)
}
class UnsortedTestSuite extends SparkFunSuite {
configuredUnitTest("The truth test.") { sc =>
val sqlContext = new SQLContext(sc)
import sqlContext.implicits._
val aDF = sc.parallelize(Entities.as, 4).toDF
val bDF = sc.parallelize(Entities.bs, 4).toDF
aDF.show()
bDF.show()
aDF.unionAll(bDF).show
}
}
输出:
+---+---+
| a| b|
+---+---+
| 1| 3|
| 2| 4|
+---+---+
+---+---+
| b| a|
+---+---+
| 5| 3|
| 6| 4|
+---+---+
+---+---+
| a| b|
+---+---+
| 1| 3|
| 2| 4|
| 5| 3|
| 6| 4|
+---+---+
为什么结果包含混合 “b” 和 “一”列,而不是根据列名对齐列?听起来像一个严重错误!?
Thx!这不是一个真正的问题,至少在我的情况下,列顺序需要改变。尽管如此,将Scala文档中的这些信息有助于避免错误。不过,我会提供一个'unionAllVia ColumnNames'重新排列列,使得它们在1相匹配:1的方式,如果可能的。 –
@MartinSenne其实Scala的Google文档提供了足够的信息来获得在接受的答案所描述的具体行为。也就是说, '这相当于UNION ALL在SQL' – kasur
@MartinSenne您指出行的排序。这应该在文档中提到。 –