【问题标题】:Recursively adding rows to a dataframe递归地将行添加到数据框中
【发布时间】:2017-12-22 06:30:52
【问题描述】:

我是新来的火花。我有一些json 数据作为HttpResponse 提供。我需要将这些数据存储在配置单元表中。每个HttpGet 请求都会返回一个json,它将是表中的一行。因此,我必须将单行作为文件写入配置单元表目录中。

但是我觉得有太多的小文件会降低速度和效率。那么有没有一种方法可以递归地将新行添加到Dataframe 并一次将其写入配置单元表目录。我觉得这也会减少我的 spark 代码的运行时间。

例子:

for(i <- 1 to 10){
 newDF = hiveContext.read.json("path")
 df = df.union(newDF)
}
df.write()

我了解数据帧是不可变的。有没有办法做到这一点?

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: scala hadoop apache-spark recursion dataframe


    【解决方案1】:

    您显然在滥用 Spark。 Apache Spark 是分析系统,而不是数据库 API。像这样使用 Spark 修改 Hive 数据库没有任何好处。它只会带来严重的性能损失,而不会受益于任何 Spark 功能,包括分布式处理。

    您应该直接使用 Hive 客户端来执行事务操作。

    【讨论】:

    • 对不起,你明白我的问题吗?我正在寻找将从 Json 获得的数据框保存到配置单元表目录中。我没有尝试使用 spark 修改 Hive 表/数据库。
    • 这不是问题的答案;它应该是对问题的评论。
    【解决方案2】:

    如果您可以批量下载所有数据(例如使用 curl 或其他程序的脚本)并首先将其存储在一个文件中(或多个文件,spark 可以一次加载整个目录),那么您可以一次将该文件(或多个文件)全部加载到 spark 中以进行处理。我还会检查 webapi 以将其视为任何端点,以获取您需要的所有数据,而不是一次只获取一条记录。

    【讨论】:

    • 感谢您的回答。你给的是一个很好的方法。但是我无法从 API 一次获取所有数据。而且我需要将数据框保存为 json 文件。是否可以创建一个包含所有记录的 json 文件(使用 java)?如果是,我可以将该文件读入我的数据框中。
    • @HemanthAnnavarapu 是的,这就是我的建议,只需提前将所有数据下载到一个文件或几个文件中。像curl -w "\n" [url] &gt;&gt; [jsonfile] 这样的东西在所有网址的循环中应该可以工作。您也可以使用 java 或 scala 或您喜欢的任何其他语言进行下载。
    【解决方案3】:

    您大多是在正确的轨道上,您要做的是获取多个单个记录作为Seq[DataFrame],然后通过合并它们将Seq[DataFrame] 减少为单个DataFrame

    从您提供的代码开始:

    val BatchSize = 100
    val HiveTableName = "table"
    
    (0 until BatchSize).
    map(_ => hiveContext.read.json("path")).
    reduce(_ union _).
    write.insertInto(HiveTableName)
    

    或者,如果您想随时执行 HTTP 请求,我们也可以这样做。假设您有一个执行 HTTP 请求并将其转换为 DataFrame 的函数:

    def obtainRecord(...): DataFrame = ???
    

    您可以按照以下方式做一些事情:

    val HiveTableName = "table"
    val OtherHiveTableName = "other_table"
    val jsonArray = ???
    
    val batched: DataFrame =
        jsonArray.
        map { parameter =>
          obtainRecord(parameter)
        }.
        reduce(_ union _)
    batched.write.insertInto(HiveTableName)
    batched.select($"...").write.insertInto(OtherHiveTableName)
    

    【讨论】:

    • 感谢您的回答。我正在尝试实现这一点。为了发布我的获取请求,我需要一个来自 json 数组的每个元素的参数(之前已获取)。那么,有没有更好的方法来实现 for 循环,这样我就可以拥有一个随着每次迭代而增加的变量(这个变量用于访问数组每个元素中的参数)?
    • 你只需要一个从 0 递增到任何值的索引吗?
    • 我刚刚更新了我认为更好地反映您正在尝试做的事情的答案。这假设您希望一次性处理获取的 JSON 数组(并写入单个文件)。您也可以先拆分 JSON 数组,或者连接多个 JSON 数组,具体取决于您要执行的操作。
    • 这很奇怪,但我在我的 IDE 中看不到 .map 的选项 jsonArray。我错过了什么吗?
    • jsonArray的类型是什么?您提到它是一个“json 数组”,所以我认为它是某种数组。
    猜你喜欢
    • 2015-08-13
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    相关资源
    最近更新 更多