如何从不同列的PySpark数据帧中提取数组元素?

如何从不同列的PySpark数据帧中提取数组元素?,pyspark,pyspark-sql,Pyspark,Pyspark Sql,我有以下PySpark输入数据帧: +----+------+ |索引|值列表| +----+------+ | 1.0 | [10,20,30] | | 2.0 | [11,21,31] | | 0.0 | [14,12,15] | +----+------+ 其中: 索引:类型双 Valuelist:类型Vector。它不是数组 从上面的输入数据帧中,我想获得PySpark中的以下输出数据帧 +----+----+ |指数|值| +----+----+ | 1.0 | 20

我有以下PySpark输入数据帧:

+----+------+ |索引|值列表| +----+------+ | 1.0 | [10,20,30] | | 2.0 | [11,21,31] | | 0.0 | [14,12,15] | +----+------+ 其中:

索引:类型双 Valuelist:类型Vector。它不是数组 从上面的输入数据帧中,我想获得PySpark中的以下输出数据帧

+----+----+ |指数|值| +----+----+ | 1.0 | 20 | | 2.0 | 31 | | 0.0 | 14 | +----+----+ 逻辑:

对于每行: 值=值列表[索引]
您可以创建一个新列并将这两列作为输入传递

从pyspark.sql导入函数为F 列=['index','valuelist'] VAL=[ 0, [1,2], 1, [1,2] ] df=sqlContext.createDataFramevals,列 df=df.withColumn 值,udflambda索引和列表:索引和列表[0][索引和列表[1]],整数类型 F.structF.colvaluelist,F.colindex 获得以下输出:

> +---+-----+---+ |索引|值列表|值| +---+-----+---+ | 0| [1, 2]| 1| | 1| [1, 2]| 2| +---+-----+---+ Spark版本1.5及更高版本 您可以使用pyspark.sql.functions.expr来:

df.selectindex,f.exprvaluelist[CASTindex为整数].aliasvalue.show +---+---+ |指数|值| +---+---+ | 1.0| 20| | 2.0| 31| | 0.0| 14| +---+---+ Spark版本2.1及更高版本 如果您使用的是spark 2.1或更高版本,这里有一个使用pyspark.sql.functions.posexplode的替代方案:

导入pyspark.sql.f函数 df.selectindex,f.posexplodevaluelist.aliaspos,value\ 其中f.colindex.castint==f.colpos\ .选择索引、值\ 显示 +---+---+ |指数|值| +---+---+ | 1.0| 20| | 2.0| 31| | 0.0| 14| +---+---+
这将在OP的代码中导致错误,因为它们的索引列不是整数,但是通过添加强制转换很容易修复。无论如何,我认为您的udf过于复杂/难以理解-如果必须在这里使用,我会使用类似df=df.withColumnvalue、udflambda valuelist、index:valuelist[index]、IntegerTypeF.colvaluelist、F.colindex.castint的内容,因为没有定义错误名称“udf”。知道吗?从pyspark.sql.functions导入udf