Apache spark 如何将forEach的结果存储在Spark中

Apache spark 如何将forEach的结果存储在Spark中,apache-spark,spark-dataframe,Apache Spark,Spark Dataframe,DataSet#foreach(f)将函数f应用于数据集中的每一行。在集群环境中,数据在集群中分割。如何收集每个函数的结果 例如,假设函数计算每行中存储的字符数。如何创建一个数据集或RDD,其中包含应用于每行的每个函数的结果?foreach的定义如下所示: f:应用于每个元素的副作用的函数。 函数f的结果被丢弃 Scala中的foreach通常用于表示涉及副作用的函数的使用,例如打印到标准输出 如果要通过应用特定函数返回某些内容,则必须使用map 我从列表的文档中复制了语法,但对于RDD也会类似

DataSet#foreach(f)
将函数
f
应用于数据集中的每一行。在集群环境中,数据在集群中分割。如何收集每个函数的结果


例如,假设函数计算每行中存储的字符数。如何创建一个数据集或RDD,其中包含应用于每行的每个函数的结果?

foreach的定义如下所示:

f
:应用于每个元素的副作用的函数。 函数
f
的结果被丢弃

Scala中的foreach通常用于表示涉及副作用的函数的使用,例如打印到标准输出

如果要通过应用特定函数返回某些内容,则必须使用
map

我从
列表
的文档中复制了语法,但对于RDD也会类似

如您所见,它在数据类型
A
上运行函数
f
,并返回数据类型
B
的集合,其中
A
B
也可以是相同的数据类型

val rdd = sc.parallelize(Array(
      "String1",
      "String2",
      "String3" ))

scala> rdd.foreach(x => (x, x.length) ) 

// Nothing happens

rdd.map(x => (x, x.length) ).collect

// Array[(String, Int)] = Array((String1,7), (String2,7), (String3,7))

使用
map
而不是
foreach
final  def  map[B](f: (A) ⇒ B): List[B]
val rdd = sc.parallelize(Array(
      "String1",
      "String2",
      "String3" ))

scala> rdd.foreach(x => (x, x.length) ) 

// Nothing happens

rdd.map(x => (x, x.length) ).collect

// Array[(String, Int)] = Array((String1,7), (String2,7), (String3,7))