PySpark-从列表中获取字符串位置
我有一个带有列FN的数据帧和这些列值的子集列表 e、 g 我想在我的数据框中添加一列,如果列值存在于列表中,我将记录列表中的位置,即我的结束DFPySpark-从列表中获取字符串位置,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 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('')))
但是,当运行时,我得到一个“Job由于阶段故障而中止”异常和一系列其他异常,唯一有意义的部分是“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