PySpark-从列表中获取字符串位置

PySpark-从列表中获取字符串位置,pyspark,Pyspark,我有一个带有列FN的数据帧和这些列值的子集列表 e、 g 我想在我的数据框中添加一列,如果列值存在于列表中,我将记录列表中的位置,即我的结束DF FN POS ABC DEF 1 GHI 0 JKL MNO 我的代码如下 from pyspark.sql.functions import udf from pyspark.sql.types import StringType l = ["GH

我有一个带有列FN的数据帧和这些列值的子集列表 e、 g

我想在我的数据框中添加一列,如果列值存在于列表中,我将记录列表中的位置,即我的结束DF

    FN     POS
    ABC
    DEF    1
    GHI    0
    JKL
    MNO
我的代码如下

    from pyspark.sql.functions import udf
    from pyspark.sql.types import StringType
    l = ["GHI","DEF"]

    x = udf(lambda fn, p = l: p.index(fn), StringType())
    
    df = df.withColumn('POS', when(col("FN").isin(l), x(col("FN"))).otherwise(lit('')))
但是,当运行时,我得到一个“J
ob由于阶段故障而中止”异常和一系列其他异常,唯一有意义的部分是“
ValueError:'JKL'不在列表中”
(JKL是我的DF列中的随机其他列)

如果我不输入“
p.index(fn)
”,而只输入“fn”,我会在新列中得到正确的列值,同样地,如果我使用“
p.index(“DEF”)
”,我会得到“1”,所以这些都是单独工作的,你知道为什么会出现异常吗

短暂性脑缺血发作


编辑:我通过在lambda中执行if-else来解决这个问题,这几乎意味着它在withColumn语句中的“isin”检查之前执行lambda。
我想知道的是(除了上述是否属实之外),有人对如何以更好的方式实现这一目标有更好的建议吗?

以下是我的尝试。我已经为给定的列表创建了一个数据框架并加入它们

from pyspark.sql.functions import *

l = ['GHI','DEF']
m = [(l[i], i) for i in range(0, len(l))]

df2 = spark.createDataFrame(m).toDF('FN', 'POS')
df1 = spark.createDataFrame(['POS','ABC','DEF','GHI','JKL','MNO'], "string").toDF('FN')

df1.join(df2, ['FN'], 'left').show()

+---+----+
| FN| POS|
+---+----+
|JKL|null|
|MNO|null|
|DEF|   1|
|POS|null|
|GHI|   0|
|ABC|null|
+---+----+

这是我的尝试。我已经为给定的列表创建了一个数据框架并加入它们

from pyspark.sql.functions import *

l = ['GHI','DEF']
m = [(l[i], i) for i in range(0, len(l))]

df2 = spark.createDataFrame(m).toDF('FN', 'POS')
df1 = spark.createDataFrame(['POS','ABC','DEF','GHI','JKL','MNO'], "string").toDF('FN')

df1.join(df2, ['FN'], 'left').show()

+---+----+
| FN| POS|
+---+----+
|JKL|null|
|MNO|null|
|DEF|   1|
|POS|null|
|GHI|   0|
|ABC|null|
+---+----+

请发布预期输出您将不得不使用if-else,因为您需要处理项目是否不在列表中创建映射
map1=expr(f“””映射({',')。连接(f“{e},{i}”代表i,e in enumerate(List))})”
,然后执行
df.withColumn('POS',coalesce(map1[col('FN')]),lit(“”)).show()
。确保从pyspark.sql.functions导入expr,coalesce,lit,请发布预期输出您将必须使用if-else,因为您需要处理该项是否不在列表中创建一个映射
map1=expr(f“”)映射({,'.join(f“{e},{i}”表示枚举(列表))
,然后执行
df.withColumn('POS',coalesce(map1[col('FN')],点亮(“”))。show()
。确保从pyspark.sql.functions导入expr、coalesce和lit