Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PySpark-在dataframe列中创建的列表的类型为String而不是Integer_Python_List_Pyspark - Fatal编程技术网

Python PySpark-在dataframe列中创建的列表的类型为String而不是Integer

Python PySpark-在dataframe列中创建的列表的类型为String而不是Integer,python,list,pyspark,Python,List,Pyspark,我有一个数据帧- values = [('A',8),('B',7)] df = sqlContext.createDataFrame(values,['col1','col2']) df.show() +----+----+ |col1|col2| +----+----+ | A| 8| | B| 7| +----+----+ 我想要从0到col2的偶数列表 我得到了我想要的列表,但是列表是字符串类型而不是int,正如您在上面的printschema中看到的那样 如何获取in

我有一个数据帧-

values = [('A',8),('B',7)]
df = sqlContext.createDataFrame(values,['col1','col2'])
df.show()
+----+----+
|col1|col2|
+----+----+
|   A|   8|
|   B|   7|
+----+----+
我想要从0到col2的偶数列表

我得到了我想要的列表,但是列表是字符串类型而不是int,正如您在上面的printschema中看到的那样

如何获取int类型的列表?如果没有int类型,我无法分解此数据帧


关于如何获取整数列表有什么想法吗?

您需要指定udf的返回类型;要获取int的列表,请使用ArrayTypeIntegerType:

或者,如果您使用的是spark 2.4,则可以使用新的顺序功能:

values = [('A',8),('B',7)]
df = sqlContext.createDataFrame(values,['col1','col2'])

from pyspark.sql.functions import sequence, lit, col
df.withColumn('list', sequence(lit(0), col('col2'), step=lit(2))).show()
+----+----+---------------+
|col1|col2|           list|
+----+----+---------------+
|   A|   8|[0, 2, 4, 6, 8]|
|   B|   7|   [0, 2, 4, 6]|
+----+----+---------------+

需要指定自定义项的返回类型;要获取int的列表,请使用ArrayTypeIntegerType:

或者,如果您使用的是spark 2.4,则可以使用新的顺序功能:

values = [('A',8),('B',7)]
df = sqlContext.createDataFrame(values,['col1','col2'])

from pyspark.sql.functions import sequence, lit, col
df.withColumn('list', sequence(lit(0), col('col2'), step=lit(2))).show()
+----+----+---------------+
|col1|col2|           list|
+----+----+---------------+
|   A|   8|[0, 2, 4, 6, 8]|
|   B|   7|   [0, 2, 4, 6]|
+----+----+---------------+

事实证明,有一种方法可以通过将所需列表列中的数字连接起来来获取数字

我们可以实现这个函数,然后使用一些字符串操作和正则表达式,仅使用API函数即可获得所需的输出。尽管它更复杂,但这应该比使用udf更快

使用Wolfram Alpha,您可以计算此和的闭合形式方程

获得该数字后,可以将其转换为前导0中的字符串外接程序


最后,我在每个数字之间添加了一个逗号作为分隔符,将结果拆分,并将其转换为一个整数数组。

结果是,有一个将通过在所需的列表列中连接数字来获得数字

我们可以实现这个函数,然后使用一些字符串操作和正则表达式,仅使用API函数即可获得所需的输出。尽管它更复杂,但这应该比使用udf更快

使用Wolfram Alpha,您可以计算此和的闭合形式方程

获得该数字后,可以将其转换为前导0中的字符串外接程序


最后,我在每个数字之间添加了一个逗号作为分隔符,分割结果,并将其转换为一个整数数组。

如果您不指定自定义项的返回类型,那么它将默认为StringType顺便说一句,如果您的最终目标是分解列表,您也可以尝试来自的代码变体。非常感谢Pault的努力。我将探索这个链接。我问这个问题是因为我想解决这个问题-如果你不指定udf的返回类型,它将默认为StringType顺便说一句,如果你的最终目标是分解列表,你也可以尝试代码的变体。非常感谢Pault的努力。我将探索这个链接。我问这个问题是因为我想解决这个问题——我对如何只使用API函数来实现这一点有一些想法,但在这种情况下,我认为udf是首选。尽管如此,如果你想发布API版本,请随时发布;这可能不是OP所要求的,但仍然可以提供帮助-事实上,我找到了一种没有udfI的合理方法。我有一些关于如何仅使用API函数来实现这一点的想法,但在这种情况下,我认为udf是首选。如果您有API版本,请随时发布;这可能不是OP所要求的,但仍然可以提供帮助——事实上,我找到了一个没有udfI的合理方法,我不得不说这真的很聪明。不过,人们需要一些时间来消化。在spark 2.4中,您实际上可以使用sequence来避免udf。尽管如此,spark 2.4之前还是有一个很好的解决方案。@Psidom实际上,当n>4时,它会中断。sequence是2.4+的最佳解决方案,否则使用udfI必须说这是非常明智的。不过,人们需要一些时间来消化。在spark 2.4中,您实际上可以使用sequence来避免udf。尽管如此,spark 2.4之前还是有一个很好的解决方案。@Psidom实际上,当n>4时,它会中断。sequence是2.4+的最佳解决方案,否则使用udf
values = [('A',8),('B',7)]
df = sqlContext.createDataFrame(values,['col1','col2'])

from pyspark.sql.functions import sequence, lit, col
df.withColumn('list', sequence(lit(0), col('col2'), step=lit(2))).show()
+----+----+---------------+
|col1|col2|           list|
+----+----+---------------+
|   A|   8|[0, 2, 4, 6, 8]|
|   B|   7|   [0, 2, 4, 6]|
+----+----+---------------+
import pyspark.sql.functions as f

def getEvenNumList(x):
    n = f.floor(x/2)
    return f.split(
        f.concat(
            f.lit("0,"), 
            f.regexp_replace(
                (2./81.*(-9*n+f.pow(10, (n+1))-10)).cast('int').cast('string'), 
                r"(?<=\d)(?=\d)", 
                ","
            )
        ),
        ","
    ).cast("array<int>")

df = df.withColumn("list", getEvenNumList(f.col("col2")))
df.show()
#+----+----+---------------+
#|col1|col2|           list|
#+----+----+---------------+
#|   A|   8|[0, 2, 4, 6, 8]|
#|   B|   7|   [0, 2, 4, 6]|
#+----+----+---------------+

df.printSchema()
#root
# |-- col1: string (nullable = true)
# |-- col2: long (nullable = true)
# |-- list: array (nullable = true)
# |    |-- element: integer (containsNull = true)
2*sum(i*10**(n-i) for i in range(1,n+1))