Pyspark Pypark将索引列传递给元素_at()

Pyspark Pypark将索引列传递给元素_at(),pyspark,Pyspark,能否将带有索引值的pyspark列传递到元素_at函数中 我有一个类似于以下的df: ------------------ foo | bar ------------------ 1 | [3, 2, 1] 2 | [3, 3, 1] 1 | [8, 2, 1] baz | -------- 3 | 3 | 8 | 我尝试使用foo作为索引来创建以下内容: ------------------ foo |

能否将带有索引值的pyspark列传递到元素_at函数中

我有一个类似于以下的df:

------------------
 foo   |   bar
------------------
  1    |   [3, 2, 1]
  2    |   [3, 3, 1]
  1    |   [8, 2, 1]
 baz  |
--------
  3   |
  3   |
  8   |
我尝试使用foo作为索引来创建以下内容:

------------------
 foo   |   bar
------------------
  1    |   [3, 2, 1]
  2    |   [3, 3, 1]
  1    |   [8, 2, 1]
 baz  |
--------
  3   |
  3   |
  8   |
我试图使用以下方法,但没有成功:

df.withColumn('baz', F.element_at('bar', F.col('foo'))

此代码将获得所需的结果:

df.withColumn(“baz”,F.col(“bar”)[F.col(“foo”)-F.lit(1)]。show()
我不得不从
foo
中减去一,因为它看起来像是在使用1-index。PySpark数组是零索引的

这是更标准的解决方案

df.withColumn(“baz”,F.col(“bar”)[F.col(“foo”)]).show()
下面是生成示例数据的代码:

data=[(1[3,2,1]),(2[3,3,1]),(1[8,2,1])]
df=spark.createDataFrame(数据,[“foo”,“bar”])

您也可以使用
sql表达式
使用
.expr

如果foo列已经是int(而不是bigint),则不需要强制转换

df.withColumn("baz", F.expr("""element_at(bar,cast(foo as int))""")).show()

#+---+---------+---+
#|foo|      bar|baz|
#+---+---------+---+
#|  1|[3, 2, 1]|  3|
#|  2|[3, 3, 1]|  3|
#|  1|[8, 2, 1]|  8|
#+---+---------+---+