Apache spark apachespark中的传递行集

Apache spark apachespark中的传递行集,apache-spark,Apache Spark,在ApacheSpark中,如何将一组行(而不是逐行)传递给转换函数?我正在使用python 在我的数据集中,一组行是相关的,因此我需要在函数中同时处理它。 对于Spark的Python API,恐怕这是不可能的。Scala和Java API的SparkContext有一个名为hadoopFile的方法,该方法采用自定义的InputFormat,但Python API似乎缺少此功能。 我看到修改RDD创建行为的唯一方法是使用方法parallelize,并为文件编写自己的解析器。当然,这可能不是很

在ApacheSpark中,如何将一组行(而不是逐行)传递给转换函数?我正在使用python

在我的数据集中,一组行是相关的,因此我需要在函数中同时处理它。


对于Spark的Python API,恐怕这是不可能的。Scala和Java API的SparkContext有一个名为
hadoopFile
的方法,该方法采用自定义的
InputFormat
,但Python API似乎缺少此功能。
我看到修改RDD创建行为的唯一方法是使用方法
parallelize
,并为文件编写自己的解析器。当然,这可能不是很好的扩展性,并且随着文件大小的增长可能会出现问题,但作为一种快速解决方法,它应该足够了。
最佳,Artjom


对于Spark的Python API,恐怕这是不可能的。Scala和Java API的SparkContext有一个名为
hadoopFile
的方法,该方法采用自定义的
InputFormat
,但Python API似乎缺少此功能。
我看到修改RDD创建行为的唯一方法是使用方法
parallelize
,并为文件编写自己的解析器。当然,这可能不是很好的扩展性,并且随着文件大小的增长可能会出现问题,但作为一种快速解决方法,它应该足够了。
最好的,Artjom

我看到了两种解决方案:

  • 使用支持自定义
    InputFormat
    s的Java或Scala

  • 预处理文件以将相关行放在一行中,每行使用另一个分隔符替换换行符。然后,您可以在处理时使用该字符
    拆分
    ,以收回行

我看到了两种解决方案:

  • 使用支持自定义
    InputFormat
    s的Java或Scala

  • 预处理文件以将相关行放在一行中,每行使用另一个分隔符替换换行符。然后,您可以在处理时使用该字符
    拆分
    ,以收回行


我对python API不太熟悉,在Scala中,您可以这样做:

sc.textFile("/path/blar/blar", numPartitions).mapPartitions(linesIterator => {
  // Some code that uses the lines iterator
})
numPartitions
将影响总共有多少行块,从而影响lineIterator的大小(请注意,它是一个迭代器,所以很懒-您可以使用好的代码避免OOM)。我建议阅读RDD上的
重新分区
方法的代码,以进一步了解分区的工作原理

现在这样做,没有简单的通用O(N)方法来确保依赖行在同一块中;如果您知道依赖行在同一个文件中,那么不要更改分区,它们将在一起

在不了解数据中的结构和关系的情况下,我建议的唯一通用方法是将每一行映射到某个组编号(索引其依赖集),然后按该编号分组。例如

ssc.get.textFile("/path/blar/blar")
.map(line => (someFuncToDecideGroup, line)).groupByKey()
.mapValues(linesSeq => blar blar)

注意,这个时间行是一个序列,因此在大的时候很容易引起内存问题,请考虑用代码< >代码>还原ByKEY < /C> >。

< P>我不完全熟悉Python API,在Scala中,你会这样做:

sc.textFile("/path/blar/blar", numPartitions).mapPartitions(linesIterator => {
  // Some code that uses the lines iterator
})
numPartitions
将影响总共有多少行块,从而影响lineIterator的大小(请注意,它是一个迭代器,所以很懒-您可以使用好的代码避免OOM)。我建议阅读RDD上的
重新分区
方法的代码,以进一步了解分区的工作原理

现在这样做,没有简单的通用O(N)方法来确保依赖行在同一块中;如果您知道依赖行在同一个文件中,那么不要更改分区,它们将在一起

在不了解数据中的结构和关系的情况下,我建议的唯一通用方法是将每一行映射到某个组编号(索引其依赖集),然后按该编号分组。例如

ssc.get.textFile("/path/blar/blar")
.map(line => (someFuncToDecideGroup, line)).groupByKey()
.mapValues(linesSeq => blar blar)

注意,这个时间行是一个序列,因此在大的时候很容易引起内存问题,考虑用代码< >代码> ReopeByKy< /C>代替。使用一些全局变量来存储细节,如行数或任何帮助您分组的行,如果你不能通过一组行(它不是一个理想的解决方案).

如果您无法通过一组行(这不是一个理想的解决方案),请使用一些全局变量来存储行数等详细信息或帮助您对行进行分组的任何信息。

谢谢您的回复。因为我已经用python编写了整个项目,所以改变语言是不可伸缩的。我的文件大小超过50GB。所以拆分也是不可伸缩的。谢谢您的回复。因为我已经用python编写了整个项目,所以改变语言是不可伸缩的。我的文件大小超过50GB。因此,拆分它也是不可伸缩的。