0
A
回答
3
正如在評論這個問題指出,無論是GraphFrames也不GraphX已經內置了對二分圖的支持。但是,它們都具有足夠的靈活性讓您創建二分圖。對於GraphX解決方案,請參閱this previous answer。該解決方案使用不同頂點/對象類型之間的共享特徵。雖然這與RDDs
一起工作,但這不適用於DataFrames
。 DataFrame
中的一行具有固定模式 - 它有時不包含price
列,有時不包含。它可以有一個price
列,有時候是null
,但列必須存在於每一行中。
相反,GraphFrames
的解決方案似乎是,你需要定義一個DataFrame
這本質上是一個線性子型兩種類型的二分圖的對象 - 它必須包含所有這兩種類型的字段對象。這實際上很容易 - 與full_outer
會給你。事情是這樣的:
val players = Seq(
(1,"dave", 34),
(2,"griffin", 44)
).toDF("id", "name", "age")
val teams = Seq(
(101,"lions","7-1"),
(102,"tigers","5-3"),
(103,"bears","0-9")
).toDF("id","team","record")
然後,您可以創建一個超集DataFrame
這樣的:
val teamPlayer = players.withColumnRenamed("id", "l_id").join(
teams.withColumnRenamed("id", "r_id"),
$"r_id" === $"l_id", "full_outer"
).withColumn("l_id", coalesce($"l_id", $"r_id"))
.drop($"r_id")
.withColumnRenamed("l_id", "id")
teamPlayer.show
+---+-------+----+------+------+
| id| name| age| team|record|
+---+-------+----+------+------+
|101| null|null| lions| 7-1|
|102| null|null|tigers| 5-3|
|103| null|null| bears| 0-9|
| 1| dave| 34| null| null|
| 2|griffin| 44| null| null|
+---+-------+----+------+------+
你可能做到這一點吸塵器structs
:
val tpStructs = players.select($"id" as "l_id", struct($"name", $"age") as "player").join(
teams.select($"id" as "r_id", struct($"team",$"record") as "team"),
$"l_id" === $"r_id",
"full_outer"
).withColumn("l_id", coalesce($"l_id", $"r_id"))
.drop($"r_id")
.withColumnRenamed("l_id", "id")
tpStructs.show
+---+------------+------------+
| id| player| team|
+---+------------+------------+
|101| null| [lions,7-1]|
|102| null|[tigers,5-3]|
|103| null| [bears,0-9]|
| 1| [dave,34]| null|
| 2|[griffin,44]| null|
+---+------------+------------+
我我也會指出,或多或少的相同的解決方案將在GraphX
與RDDs
工作。你總是可以通過創建連接兩個case classes
頂點不共享任何traits
:
case class Player(name: String, age: Int)
val playerRdd = sc.parallelize(Seq(
(1L, Player("date", 34)),
(2L, Player("griffin", 44))
))
case class Team(team: String, record: String)
val teamRdd = sc.parallelize(Seq(
(101L, Team("lions", "7-1")),
(102L, Team("tigers", "5-3")),
(103L, Team("bears", "0-9"))
))
playerRdd.fullOuterJoin(teamRdd).collect foreach println
(101,(None,Some(Team(lions,7-1))))
(1,(Some(Player(date,34)),None))
(102,(None,Some(Team(tigers,5-3))))
(2,(Some(Player(griffin,44)),None))
(103,(None,Some(Team(bears,0-9))))
與所有對於前面的答案,這似乎是一個更靈活的方式來處理它 - 而無需共享trait
組合的對象之間。
相關問題
- 1. Bokeh API是否支持3D圖?
- 2. 是否有可能創建分組堆積條形圖支持.Net圖表
- 3. 是否支持新行創建?
- 4. SourceTree是否支持創建git bundle?
- 5. API是否支持CORS?
- 6. Kong是否支持API Aggregation
- 7. Gmail API是否支持JWT?
- 8. QBO Api是否支持PurcharseOrders?
- 9. RhinoJS是否支持websockets API?
- 10. Orbeon - 持久性API是否不支持POST來創建表單數據?
- 11. v4l2是否支持多圖?
- 12. 創建圖形/圖支持反應母語
- 13. DGML是否支持不同的形狀?
- 14. iOS - AVFoundation是否支持3D條形碼?
- 15. Leafletjs是否支持非方形瓷磚
- 16. 是否可以使用圖形API創建一個Facebook頁面?
- 17. 是否可以通過圖形API創建Facebook地點?
- 18. Rhomobile支持圖形?
- 19. 建議新會議時間不受Office 365圖形API支持
- 20. Instagram API是否支持批量調用?
- 21. Apache jclouds api是否支持Miscrosoft Azure SAS
- 22. Dropbox API V2是否仍支持Sandbox?
- 23. Google Drive api是否支持2腳oauth?
- 24. Android API是否支持KML文件?
- 25. IE10是否支持HTML 5 History API?
- 26. Chrome擴展是否支持WebSpeech API?
- 27. SecKeychain API是否支持iCloud Keychain同步?
- 28. AWS API網關是否支持OpenAPI 3.0?
- 29. Spring框架是否支持Jersey API
- 30. Mail.app是否支持插件(API)?
不,它不會出現,除非您遵循提供的解決方案[這裏](http://stackoverflow.com/a/33243012/3415409) – eliasah