问题描述
我有一列叫做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]|
+----------+------------------------------+