微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在列中,在PySpark的列表中的两个元素之间创建一个范围

如何解决在列中,在PySpark的列表中的两个元素之间创建一个范围

我有一列叫做ID。在该列中,每一行都是一串数字组成的列表……是的,这是一口。

传入数据

ID:

['100','105']

['200']

['205','210']

我正在寻找一种东西,可以在第一个和最后一个数字之间解析出具有多个元素的任何行。例如

期望的输出

ID:

[100,101,102,103,104,105]

[200]

[205,206,207,208,209,210]

这是我的尝试,我不知道如何构造语法,甚至逻辑也不会起作用:

temp_list = []

df = df.withColumn("ID",when(df['ID'].count() > 0,first_number = int(df['ID'][0])
last_number = int(df['ID'][1])

x = range(first_number,last_number)

for n in x:
    temp_list.append(n)
return temp_list)

.otherwise(int(df['ID']))

所以我要创建一个空列表。如果有任何行包含多个元素,请使用ID列,定义第一个数字和最后一个数字。

使用范围函数在这两个数字之间进行迭代,然后将其附加到空列表中并返回。

否则,将值保持不变,但将其设置为int。这样做有很多错误,但是任何朝着正确方向指向的指针都会受到赞赏。

谢谢。

解决方法

使用spark 2.4+时,有一个功能sequence

from pyspark.sql.types import *

data = [
    ['100','105'],['200'],['205','210']
]

df = spark.createDataFrame(data,ArrayType(StringType()))

df2 = df.withColumn('sequence',when(size('value') > 1,sequence(col('value')[0].cast('int'),col('value')[1].cast('int'))).otherwise(col('value')))
df2.show(truncate=False)

+----------+------------------------------+
|value     |sequence                      |
+----------+------------------------------+
|[100,105]|[100,101,102,103,104,105]|
|[200]     |[200]                         |
|[205,210]|[205,206,207,208,209,210]|
+----------+------------------------------+

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。