使用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您指出行的排序。這應該在文檔中提到。 –