我正在编写一个pyspark面向生物的应用程序,在其中一个步骤中,我有一个提取dna序列的sparkDataframe。对于那些出现在负链中的,我想反转补码。
我能够用udf执行任务,但我知道这限制了sparks的效率(特别是因为这是pyspark)。这也会导致oom问题。
反转字符串很容易,因为它是一个内置的功能,但我找不到一个方法来补充dna碱基(a->t,g->c,n->n,…)。
有什么办法吗?如果没有,用java实现它并在python中将它注册为udf会有帮助吗?
我运行的是emr6.20,所以它是基于spark3的
编辑:根据请求编辑示例数据。假设我有一个包含以下数据的Dataframe:
+------------+
| sequence|
+------------+
|ATTGCCATGCCA|
|GTTCGTTA |
|ATNNGGRRG |
+------------+
预期输出应为:
+------------+
| sequence|
+------------+
|TAACGGTACGGT|
|CAAGCAAT |
|TANNCCYYC |
+------------+
该图谱基于dna的iupac标记,补体是dna配对的互补碱基(a<->t,g<->c)。
编辑(解决方案):感谢@mck提供解决方案。反向补码调用的一个版本,采用大写序列(否则只需添加小写选项)
from pyspark.sql import functions as F
df2 = df.withColumn(
'stranded_sequence',
F.translate(
F.reverse(F.col('sequence')),
'ACGTRYSWKMBDHVN',
'TGCAYRSWMKVHDBN'
)
)
如果你有 strand
在您的df列中,您甚至可以像我一样切换case-it:
df2 = df.withColumn(
'stranded_sequence',
F.when(
F.col('strand') == '-',
F.translate(
F.reverse(F.col('sequence')),
'ACGTRYSWKMBDHVN',
'TGCAYRSWMKVHDBN'
)
).otherwise(F.col('sequence'))
)
1条答案
按热度按时间inkz8wg91#
尝试
translate
:为了说明所有可能的基,可以将字符串扩展到