【发布时间】:2023-03-19 10:22:01
【问题描述】:
这个问题我已经有一段时间了,我认为这与我对如何使用 combineByKey 和 reduceByKey 缺乏了解有关,所以希望有人能解决这个问题。
我正在处理 DNA 序列,因此我有一个程序可以生成一系列不同版本的序列(向前、向后和互补)。我有几个阅读框,这意味着对于字符串ABCABC,我想要以下一系列键:ABC ABC、A BCA BC、AB CAB C。
现在我正在使用以下函数来分解(我在 flatMap 过程中运行它):
# Modified from http://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks-in-python
def chunkCodons((seq, strand, reading_frame)):
"""
Yield successive codons from seq
"""
# Get the first characters
if reading_frame > 0:
yield (0, seq[0:reading_frame], strand, reading_frame)
for i in xrange(reading_frame, len(seq), 3):
if i % 1000000 == 0:
print "Base # = {:,}".format(i)
yield (i, seq[i:i + 3], strand, reading_frame)
我这样运行:reading_frames_rdd = nascent_reading_frames_rdd.flatMap(chunkCodons)
但是,对于一长串 DNA,这需要很长时间,所以我知道这一定是错误的。
因此,我想让 Spark 以更直接的方式执行此操作,方法是按字符(即基础)分解它,然后一次重新组合 3 个。问题是我必须组合不同但相邻的键。这意味着如果我有(1, 'A'), (2, 'B'), (3, 'C'),....,我希望能够生成 (1, 'ABC')。
我不知道该怎么做。我怀疑我需要使用 combineByKey 并让它只有条件地产生输出。如果它满足我的条件,我是否只是让它只产生可以被 combineByKey 消耗的输出?我应该这样做吗?
编辑:
这是我的输入:[(0, 'A'), (1, 'A'), (2, 'B'), (3, 'A'), (4, 'C'), ....]
我想要这样的输出:[(0, 0, 'AAB'), (0, 1, 'ABX'), ...]
和[(1, 0, 'A'), (1, 1, 'ABA'), (1, 2, 'CXX')...]。
格式为[(reading frame, first base #, sequence)]
【问题讨论】:
-
您能否提供示例输入和预期输出?
-
@zero323,我编辑了问题以添加它。
-
你能多谈谈你的目标吗?你说你想要来自
ABCABC的键似乎是任意的。为什么不ABCAB C? -
我需要密码子,因此需要 3 个组。我将形成这些组的起点从 0 移到 1 到 2。
标签: python apache-spark pyspark