如何创建一个列,其中所有值都在PySpark中的另一列给定的范围内

时间:2019-11-03 08:28:13

标签: pyspark pyspark-sql pyspark-dataframes

在使用PySpark 2.0版的以下情况下,我遇到了问题,我有一个DataFrame,其中的一列包含一个具有开始和结束值的数组,例如 [1000, 1010]

我想知道如何创建和计算包含包含给定范围内所有值的数组的另一列?生成的范围值列的结果将是:

    +--------------+-------------+-----------------------------+
    |   Description|     Accounts|                        Range|
    +--------------+-------------+-----------------------------+
    |       Range 1|   [101, 105]|    [101, 102, 103, 104, 105]|
    |       Range 2|   [200, 203]|         [200, 201, 202, 203]|
    +--------------+-------------+-----------------------------+

2 个答案:

答案 0 :(得分:1)

尝试一下。

定义udf

def range_value(a):
    start = a[0]
     end = a[1] +1 
     return list(range(start,end))

from pyspark.sql import functions as F
from pyspark.sql import types as pt

df = spark.createDataFrame([("Range 1", list([101,105])), ("Range 2", list([200, 203]))],("Description", "Accounts"))

range_value= F.udf(range_value, pt.ArrayType(pt.IntegerType()))
df = df.withColumn('Range', range_value(F.col('Accounts')))

输出

enter image description here

答案 1 :(得分:0)

您应该使用UDF (UDF sample) 考虑您的pyspark数据框名称为df,您的数据框可能像这样:

df = spark.createDataFrame(
[("Range 1", list([101,105])), 
 ("Range 2", list([200, 203]))],
("Description", "Accounts"))

您的解决方案是这样的:

import pyspark.sql.functions as F
import numpy as np

def make_range_number(arr):
    number_range = np.arange(arr[0], arr[1]+1, 1).tolist()
    return number_range

range_udf = F.udf(make_range_number)

df = df.withColumn("Range", range_udf(F.col("Accounts")))

玩得开心!:)