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

fkaflof6  于 2021-05-24  发布在  Spark
关注(0)|答案(1)|浏览(510)

我有一个名为id的列。在该列中,每行都是一个数字字符串列表。。。是的,那是一口。
传入数据
身份证件:
['100','105']
['200']
['205','210']
我在寻找这样一种东西:任何包含多个元素的行都会在第一个和最后一个数字之间被解析出来。例如
期望输出
身份证件:
[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列时,如果任何行有多个元素,请定义第一个数字和最后一个数字。
使用range函数,在这两个数字之间迭代,并将其附加到空列表中并返回它。
否则,请保持值不变,但将其设为int。这有很多错误,但任何指向正确方向的指针都将非常受欢迎。
谢谢您。

aamkag61

aamkag611#

使用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]|
+----------+------------------------------+

相关问题