dataframe选择某行某列的元素,如何从类型为Array的DataFrame列中提取出某个元素?...

问题:

'''

问题1:现有一数据表df如下,df有两列,其中values列的值为array类型,

现欲从中取出第二个元素,该如何操作?

'''

df = spark.createDataFrame([('a',[1,2,3]), ('b', [4,5,6])], ['key', 'values'])

df.show()

df.printSchema()

+---+---------+

|key| values|

+---+---------+

| a|[1, 2, 3]|

| b|[4, 5, 6]|

+---+---------+

root

|-- key: string (nullable = true)

|-- values: array (nullable = true)

| |-- element: long (containsNull = true)

'''

解决办法有三个,但是其中有两种都用到了select expression,可以归为一类,第三种方法用的是withColumn()函数。

'''

# 方法一、二

df.select(expr('key'), expr('values[1]')).show()

df.selectExpr('key', 'values[1]').show()

+---+---------+

|key|values[1]|

+---+---------+

| a| 2|

| b| 5|

+---+---------+

+---+---------+

|key|values[1]|

+---+---------+

| a| 2|

| b| 5|

+---+---------+

# 方法三

df.withColumn('c1', df['values'].getItem(1)).drop('values').show()

+---+---+

|key| c1|

+---+---+

| a| 2|

| b| 5|

+---+---+

上面提到的问题是从array列中提取子元素,如果把列的类型从array换成vector是否依然可行呢?答案是不行的。因此,我们需要使用别的方法:(1)现将column类型从vactor转化为array,这样便可以用上面介绍的方法解决了;(2)直接从vector中提取。下面我们分别使用这两种方法:

'''先将上面的array类型的DataFrame转换为vector类型.

参考 https://stackoverflow.com/questions/42138482/how-do-i-convert-an-array-i-e-list-column-to-vector

'''

from pyspark.ml.linalg import Vectors, VectorUDT

from pyspark.sql.functions import udf

list_to_vector_udf = udf(lambda l: Vectors.dense(l), VectorUDT())

df = df.select('key', list_to_vector_udf(df['values']).alias('values'))

df.show()

df.printSchema()

+---+-------------+

|key| values|

+---+-------------+

| a|[1.0,2.0,3.0]|

| b|[4.0,5.0,6.0]|

+---+-------------+

root

|-- key: string (nullable = true)

|-- values: vector (nullable = true)

# 方法一,直接从vector中提取元素, 直接使用udf

# 参考:https://stackoverflow.com/questions/44425159/access-element-of-a-vector-in-a-spark-dataframe-logistic-regression-probability

from pyspark.sql.functions import udf

from pyspark.sql.types import FloatType

firstelement=udf(lambda v:float(v[0]),FloatType())

df.select(firstelement('values').alias('val1')).show()

+----+

|val1|

+----+

| 1.0|

| 4.0|

+----+

# 方法二,先将vector转化为array,再从array中提取

# vector转array参考 https://stackoverflow.com/questions/48397543/how-to-transform-vector-into-array-for-frequent-pattern-analysis

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值