从函数的输出创建数据框

时间:2018-10-01 13:35:34

标签: scala function loops apache-spark apache-spark-sql

下面的scala代码使用一个函数来计算用户输入UnityWebRequest www = new UnityWebRequestAssetBundle(FileManager.RequestFile(path); yield return www.SendWebRequest(); if (request.isNetworkError || request.isHttpError) { Debug.Log(www.error.ToString()); } else { // for testing only // if yield return www.SendWebRequest(); is working as expected www.isDone = true here! while (!www.isDone) { Debug.Log("Something is wrong! " + www.responseCode); yield return new WaitForSeconds(0.1f); } // do whatever you want } start日期之间的天数。然后,它将遍历该时间范围内的aws s3文件。

end

我在创建一个数据帧时遇到麻烦,该数据帧是上述功能反复访问的所有文件的集合。我认为可能使用def getS3Data(s3Loc: String): DataFrame = { println(s"Reading Avro from ${s3Loc}") val cosimDf = spark.read.format("com.databricks.spark.avro") .load(s3Loc) cosimDf } val daysCount = Days.daysBetween(start,end).getDays() (0 until daysCount).map(start.plusDays(_)).foreach{x => {var myDir ="s3://AWS.Bucket/parsed/" + x.toString("yyyyMMdd") +"/" val myDf = getS3Data(myDir) }} 或将输出应用于模板可能有效,但似乎无法弄清楚如何实现。

欢迎任何帮助。

1 个答案:

答案 0 :(得分:0)

您可以在循环中创建数据框

如果知道存储在avro文件中的记录的类型,则只需将foreach替换为foldLeft并将初始值设置为给定类型的空数据框

case class YourS3RowCaseClass(...) // replace with your type

val daysCount = Days.daysBetween(start,end).getDays()
val finalDf = (0 until daysCount).map(start.plusDays(_))
  .foldLeft(spark.createDataFrame(Seq.empty[YourS3RowCaseClass])){
    case (df, x) => 
        var myDir ="s3://AWS.Bucket/parsed/" + x.toString("yyyyMMdd") +"/"
        val myDf = getS3Data(myDir)
        df.union(myDf)
  }

如果您必须从数据框中推断类型,那么可能会有些棘手