我有不同类型的数据集,这些数据集由ID
列连接。
档案A
ID, x1, x2, x3
1, 0.5, 0.2, 0.4
2, 0.2, 0.1, 0.3
3, 0.6, 0.4, 0.2
档案B
ID, y1, y2, y3
1, A, T, T
2, G, A, C
3, C, A, G
档案C
ID, z1, z2, z3
1, 34, 67, 49
2, 34, 56, 89
3, 23, 57, 87
这意味着,对于ID = 1
元素,我有
x1, y1, z1
1: [0.5, A, 34]
等等。所以我想要实现的是加载A.csv
,B.csv
和C.csv
中给出的数据,并按ID
对所有内容进行分组,以保证数据的正确性任何元素都驻留在同一节点上。
我该怎么做?
答案 0 :(得分:1)
问题: 所以我想要完成的是加载A.csv,B.csv中给出的数据 和C.csv并通过ID对所有内容进行分组,以便保证这一点 任何元素的数据都驻留在同一节点上。
我该怎么做?
答案:
默认情况下,join是广播连接(将向每个节点广播小数据(复制缓存拓扑的种类))
请参阅以下实施(特别申请方法) https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/execution/SparkStrategies.scala
上述行为由上述类中的canBroadCast
方法控制,该方法使用以下属性autoBroadCastJoinThreshHold
。
val testCSV1DF = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").load("/data/FileA.csv")
val testCSV2DF = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").load("/data/FileB.csv")
val testCSV3DF= sqlContext.read.format("com.databricks.spark.csv").option("header", "true").load("/data/FileC.csv")
// here you can save each dataframe in hive tables as well
### By default join is broadcast hash join (small data will be broadcasted(kind of replicated cache) to each node )
val joinedDF1 = testCSV1DF.as('a').join(testCSV2DF.as('b'), testCSV1DF("a.Id") === testCSV2DF("b.Id")).select("ID", "x1", "x2", "x3","y1","y2","y3")
joinedDF1.printSchema
val finaljoinedDF = joinedDF1.as('ab').join(testCSV3DF.as('c'), joinedDF1("ab.Id") === testCSV3DF("c.Id")).select("ID", "x1", "x2", "x3","y1","y2","y3","z1","z2","z3")
finaljoinedDF.printSchema
finaljoinedDF.show
您可以使用df.explain
了解正在发生的事情......
希望有所帮助!