pyspark 获取包含特定值的列

j2datikz  于 2022-11-21  发布在  Spark
关注(0)|答案(2)|浏览(135)

使用pyspark。我会有这样的数据框
| 列1|第2列|第3列|
| - -|- -|- -|
| 一个|[三、七]|五个|
| 你好|四个|六百六十六|
| 四个|全世界|四个|
现在,我想获取包含数字666的列名。
所以结果应该是“col 3”。
谢谢

编辑

添加了int之外的其他值。最好的答案只关注int值。
删除:当我们在它,我想索引也可以很容易地检索。

mrfwxfqh

mrfwxfqh1#

(df.withColumn('result', F.array(*[F.array(F.lit(x).alias('y'), col(x).alias('y')) for x in df.columns]))#Create an array of cols and values
  .withColumn('result', expr("transform(filter(result, (c,i)->(c[1]==666)),(c,i)->c[0])"))#Filter array with 666 and extract col
 .show(truncate=False))

|col1|col2|col3|result|
+----+----+----+------+
|1   |3   |5   |[]    |
|2   |4   |666 |[col3]|
|4   |6   |4   |[]    |
o2g1uqev

o2g1uqev2#

下面是一种使用列创建数组然后对其进行筛选的方法。

data_sdf. \
    withColumn('allcols', 
               func.array(*[func.struct(func.lit(c).alias('name'), func.col(c).cast('string').alias('value'))
                            for c in data_sdf.columns]
                          )
               ). \
    withColumn('cols_w_666_arr', 
               func.expr('transform(filter(allcols, x -> x.value = "666"), c -> c.name)')
               ). \
    drop('allcols'). \
    show(truncate=False)

# +---+---+---+--------------+
# |c1 |c2 |c3 |cols_w_666_arr|
# +---+---+---+--------------+
# |1  |3  |5  |[]            |
# |2  |4  |666|[c3]          |
# |4  |666|4  |[c2]          |
# |666|666|4  |[c1, c2]      |
# +---+---+---+--------------+

相关问题