并行加载S3文件Spark

时间:2017-07-28 15:03:32

标签: scala apache-spark amazon-s3 apache-spark-sql

我通过以下代码成功地将文件从S3加载到Spark中。它正在工作,但是我注意到1个文件和另一个文件之间存在延迟,并且它们是按顺序加载的。我想通过并行加载来改进这一点。

        // Load files that were loaded into firehose on this day
    var s3Files = spark.sqlContext.read.schema(schema).json("s3n://" + job.awsaccessKey + ":" + job.awssecretKey + "@" + job.bucketName + "/" + job.awss3RawFileExpression + "/" + year + "/" + monthCheck + "/" + dayCheck + "/*/").rdd

    // Apply the schema to the RDD, here we will have duplicates
    val usersDataFrame = spark.createDataFrame(s3Files, schema)

    usersDataFrame.createOrReplaceTempView("results")

    // Clean and use partition by the keys to eliminate duplicates and get latest record
    var results = spark.sql(buildCleaningQuery(job, "results"))
    results.createOrReplaceTempView("filteredResults")
    val records = spark.sql("select count(*) from filteredResults")

我也尝试通过textFile()方法加载,然而我在将RDD [String]转换为RDD [Row]时遇到问题,因为之后我需要继续使用Spark SQL。我是按照以下方式使用它的;

        var s3Files = sparkContext.textFile("s3n://" + job.awsaccessKey + ":" + job.awssecretKey + "@" + job.bucketName + "/" + job.awss3RawFileExpression + "/" + year + "/" + monthCheck + "/" + dayCheck + "/*/").toJavaRDD()

将JSON文件(每个大约50MB的多个文件)加载到Spark中的理想方式是什么?我想针对模式验证属性,因此我稍后可以使用Spark SQL查询来清理数据。

1 个答案:

答案 0 :(得分:1)

正在发生的事情是DataFrame正在转换为RDD,然后再转换为DataFrame,然后丢失分区信息。

var s3Files = spark
  .sqlContext
  .read.schema(schema)
  .json(...)
  .createOrRepla‌​ceTempView("results"‌​)

应该足够了,分区信息应该仍然存在,允许同时加载json文件。