对pyspark中的字符串进行反向补码

mbskvtky  于 2021-07-12  发布在  Spark
关注(0)|答案(1)|浏览(308)

我正在编写一个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'))
)
inkz8wg9

inkz8wg91#

尝试 translate :

import pyspark.sql.functions as F

df2 = df.withColumn('sequence', F.translate('sequence', 'ATCGRY', 'TAGCYR'))

df2.show()
+------------+
|    sequence|
+------------+
|TAACGGTACGGT|
|    CAAGCAAT|
|   TANNCCYYC|
+------------+

为了说明所有可能的基,可以将字符串扩展到

ATCGRYSWKM...
TAGCYRWSMK...

相关问题