使用spark将数据帧拆分为Scala中的两个或更多数据帧

时间:2016-12-02 09:19:39

标签: scala apache-spark

我有一个200万条记录的数据集。我想把它分成两个相等的一半。我没有任何带有序列号的列,因此我可以在其上应用where条件并将其拆分为2.这可能也不是正确的方法,但我想要做的就是将数据帧拆分为2个半的

我正在使用的示例代码:

var invoiceData = sc.textFile("/Scala/InvoiceLine.csv");
def removeheader (x : RDD[String]): RDD[String] = {
  x.mapPartitionsWithIndex((idx, lines) => {
    if (idx == 0) {
      lines.drop(1)
    }
    lines
  })
}
var invoiceWithoutHeader = removeheader(invoiceData);
var invoiceSchemaString = invoiceData.first().toUpperCase().split(",").map(_.trim());
var invoiceSchema = StructType(invoiceSchemaString.map(fieldName => StructField(fieldName, StringType, true)))
var invoiceRowRDD = invoiceWithoutHeader.map(y => {
  var parser = new CSVParser(',');
  parser.parseLine(y)
}).map { x => Row.fromSeq(x) } 
var invoiceDF = sqlContext.applySchema(invoiceRowRDD, invoiceSchema);

现在我想将invoiceDF拆分为2个部分,每个部分100万个 因为我是初学者,所以代码可能效率不高。

提前致谢:)

1 个答案:

答案 0 :(得分:4)

如果随机化数据不是问题,您只需使用randomSplit()

val Array(half1, half2) = invoiceDF.randomSplit(Array(0.5, 0.5))