Pyspark Pypark将索引列传递给元素_at()
能否将带有索引值的pyspark列传递到元素_at函数中 我有一个类似于以下的df: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 |
------------------
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|
#+---+---------+---+