为什么在通过union两个数据帧转换为镶木地板格式测试后数据发生了变化?

时间:2017-04-18 12:06:06

标签: apache-spark dataframe parquet

我写了一个函数来对csv文件进行操作,将其转换为镶木地板格式。 我想知道如何确保数据相同,不丢失或添加。 所以我为它写了一个测试。但事实证明它们不一样: 我的逻辑是:

1)将csv设为数据框 A

2)并将数据框 A 设置为镶木地板格式,保存到目录。

3)读取镶木地板文件为新的数据框 B

4)然后 A.union(B)

5)计算A和B以及A.union(B)。

如果三者相同,那么我可以得出它们是相同数据的结论。 但我得到第三个不同。

def doJob(sc: SparkContext, data: RDD[String]): DataFrame = {
    logInfo("Extracting omniture data")
    val result = data
      .filter(_.contains("PAGE."))
      .filter(_.contains(".PACKAGE"))
    val sqlsqlContext = new SQLContext(sc)

//just ignore above codes...

    val packagesCsvDF = sqlsqlContext.load("com.databricks.spark.csv", Map("path" -> "file:///D:/test/testsample.csv", "header" -> "true"))
    val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
    import sqlContext.implicits._

//
//    // we should have some additional filter here
//    val mydf = packagesDF.groupBy($"page_url").agg(last($"pagename"),last($"prop46"),last($"prop56"),last($"post_evar34"))
//    logInfo("show mydf")
//    mydf.show()

    //TODO
    // save files
    logInfo("Saving omniture packages data to S3")
    if (true) {
      packagesCsvDF
        .repartition(sc.defaultParallelism, col("pagename"))
        .write
        .mode(SaveMode.Append)
        .partitionBy("pagename")
        .parquet("file:///D:/test/parquet")
      logInfo("packagesDF")

    }

    packagesCsvDF//Is this packagesCsvDF have not been changed yet??????
  }

TEST:

object ParquetDataTestsSpec {
  def main (args: Array[String] ): Unit = {
    val sc = new SparkContext(new SparkConf().setAppName("parquet data test Logs").setMaster("local"))


    val input = PackagesOmnitureMapReduceJob.formatToJson(sc.textFile("file:///D:/test/option.json", sc.defaultParallelism))
    val df = PackagesOmnitureMapReduceJob.doJob(sc, input)//call the function I want to test in "file:///D:/test/parquet"
    val sqlContext = new SQLContext(sc)

    val SourceCSVDF = sqlContext.load("com.databricks.spark.csv", Map("path" -> "file:///D:/test/testsample.csv", "header" -> "true"))// original 

    val parquetDataFrame = sqlContext.read.parquet("file:///D:/test/parquet") //get the new dataframe

    val dfCount = df.count()
    val SourceCSVDFcount = SourceCSVDF.count()
    val parquetDataCount = parquetDataFrame.count()

    val unionCount = parquetDataFrame.union(SourceCSVDF).count()
    println(dfCount,SourceCSVDFcount,parquetDataCount,unionCount)


  }
}

打印:

(200,200,200,400)

然后我尝试将所有数据帧解析为json:

parquetDataFrame.write.json("file:///D:/test/parquetDataFrame")
SourceCSVDF.write.json("file:///D:/test/SourceCSVDF")
df.write.json("file:///D:/test/Desktop/df")

当我打开json文件时,我发现它们都是一样的......问题出在关键词 union 吗?

1 个答案:

答案 0 :(得分:0)

val unionalldis3 = parquetDataFrame.unionAll(SourceCSVDF).distinct().count()

然后是对的......

但我很困惑。我认为union()是区别的unionAll ....