按ID从不同的CSV文件分组数据

时间:2016-10-01 19:10:17

标签: csv apache-spark rdd

我有不同类型的数据集,这些数据集由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.csvB.csvC.csv中给出的数据,并按ID对所有内容进行分组,以保证数据的正确性任何元素都驻留在同一节点上。

我该怎么做?

1 个答案:

答案 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

enter image description here

在您的情况下,请参阅下面的代码片段,其中我使用了spark-csv + scala语法

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了解正在发生的事情......

希望有所帮助!