【问题标题】:Reading Row data from Spark Dataset in Loop在循环中从 Spark 数据集中读取行数据
【发布时间】:2021-10-26 15:54:36
【问题描述】:

我想用 Java 循环读取 spark 数据集的行,我必须读取里面的其他数据集。

假设 ds 是数据集,如果写循环如下,我可以读取其他数据集

ds.toJavaRDD().collect().forEach()

但我删除了 collect() 和 JavaRDD() 并直接应用

ds.foreach()

那么我无法读取其他数据集。谁能帮我解决一下?

【问题讨论】:

  • 您能否详细说明您在foreach() 内部所做的事情?因为ds.foreach()没有错,或者如果你想让你的函数返回一些值,你也可以使用map函数
  • @ShashwatSharma 我只想读取行数据,并基于此行数据,我想从其他数据集中提取更多数据。该数据集在此循环中为空。

标签: java apache-spark apache-spark-sql apache-spark-dataset


【解决方案1】:

读取数据集(比如说从 HDFS 或本地文件系统)是从 driver process 内部开始的操作。在执行器进程中运行的任何代码都不能使用SparkSession,此 API 仅存在于驱动程序中。

ds.toJavaRDD().collect().forEach(myFunction)ds.foreach(myFunction) 的区别在于,第一条语句中myFunction 在驱动进程中执行,而在第二条语句中myFunction 在执行器进程中执行,因此Spark-API 不能用过。

ds.toJavaRDD().collect() 返回一个普通的 Java List 对象,将 Spark 数据集的所有数据移动到驱动程序。此列表是存在于驱动程序进程中的标准 Java 对象。 foreach 是来自java.lang.Iterable 接口的方法。

另一方面,ds.foreach()Spark dataset 的方法,其参数方法将在不同的 Spark 执行器中并行执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 2018-03-13
    • 2016-05-05
    相关资源
    最近更新 更多